java - 以编程方式重新安装应用程序 apk 而无需下载

标签 java android

由于this annoying Android limitation我需要用户重新安装我的应用程序,以便其他应用程序检测到 list 权限。

这已经让用户感到沮丧,但此外,我看不到从/data/app 中存储的 apk 重新安装我的应用程序的方法,因此我必须将相同版本下载到存储卡在触发通常的安装 Intent 之前。

我热切地等待有人告诉我我遗漏了一些明显的东西!我画了一个空白...

提前致谢。

如果您希望问题得到解决,请给问题加注星号!干杯。


编辑:考虑到@hackbod 的评论,您可以使用以下代码启动安装对话框。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(this.getApplicationInfo().sourceDir)),
"application/vnd.android.package-archive");
startActivity(intent);

在我的 Jelly Bean 设备上,这提供了两个选项:Package installerVerify and install。我不知道后者是否会处理以下问题:

  • 以这种方式安装您的应用可能会将其所有权从 Play 商店中移除

我的应用程序是免费的,所以我无法测试以下付费问题:

  • 但是请注意,如果您的应用程序被向前锁定(由于应用程序加密,所有以 JB 开头的付费应用程序都不可避免),那么这将不起作用,因为其他人无法读取您的应用程序可执行文件

尽管 hackbod 以“其他人可读”结束,这表明如果您通过自己的代码执行它,对于您自己的应用程序,它是可读的吗?如果你可以测试这个,请纠正我,我错了。

最佳答案

可以想象,您可以通过 Context.getApplicationInfo().sourceDir 获取 .apk 的路径,然后使用该路径启动应用程序安装程序。但是,如果您的应用程序是前向锁定的(由于应用程序加密,所有以 JB 开头的付费应用程序都不可避免),那么这将不起作用,因为其他人无法读取您的应用程序可执行文件。在这种情况下,您需要将 .apk 复制到世界可读的某个地方(例如在外部存储中)并从那里安装它。

但是,无论您在这里做什么,都会产生一些不可避免的非常负面的后果:

  • 从您的应用程序进行任何类型的安装的唯一方法是通过侧面加载用户界面,这 (a) 对用户来说将是一种非常可怕的体验,并且 (b) 将要求用户打开旁加载以便能够继续。
  • 以这种方式安装您的应用程序可能会从 Play 商店中删除它的所有权(因为它不再是安装它的那个人)。例如,这可能意味着用户无法再通过 Play 商店向您报告崩溃或 ANR,或其他负面后果。我不确定这里实际会发生什么问题,但我真的不认为这会没事。

最终,我非常不建议这样做。您需要什么样的许可才能迫使您这样做?出于多种原因,我不建议第三方应用程序在大多数情况下声明自己的权限,因为围绕权限存在很多糟糕的用户体验,这些权限只有在可能需要它们之后才知道。

关于java - 以编程方式重新安装应用程序 apk 而无需下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10620464/

相关文章:

Java 依赖触发器

java - Xpath 写入一个没有任何唯一 id 的元素

java - 在 Guice 中避免框架强加的循环依赖

无论我们将 tab2 设置为默认选项卡,android 第一个选项卡 Intent oncreate 总是被调用

Android:如何向一个 Activity 添加两个 View

java - @NotThreadSafe 未找到错误

java - 什么时候克隆对象可能不是原始对象的类型?

java - Spring MVC。无法渲染参数

android - 在 RecyclerView 中单击时使用 Picasso 或任何图像加载器重新加载图像

java - 如何禁用另一个 Activity 中的按钮?