以编程方式重新安装应用程序apk而不下载

时间:2012-05-16 14:15:18

标签: java android

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

对于用户来说这已经是令人沮丧的了,但另外,我看不到从/ data / app中存储的apk重新安装我的应用程序的方法,因此我必须将相同版本下载到存储卡在解雇通常的安装意图之前。

我急切地等着有人告诉我,我错过了一些明显的东西!我画了一个空白......

提前致谢。

如果您希望解决问题,请为问题加注星标!欢呼声。


编辑:考虑到@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设备上,它提供了两个选项:包安装程序验证并安装。我不知道后者是否会处理以下问题:

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

我的申请是免费的,所以我无法测试付费问题:

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

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

1 个答案:

答案 0 :(得分:3)

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

不管你在这里做什么,这都有一些不可避免的非常消极的后果:

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

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