2012-05-16 62 views
12

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

这对用户来说已经是令人沮丧的事了,但是除此之外,我无法看到从存储在/ 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); 

在我的果冻豆设备,这提供了两个选项:包安装验证和安装。我不知道如果是后者将处理的问题:

  • 安装您的应用程序这种方式可能会从Play商店

我的应用程序是免费删除其所有权,所以我无法测试的支付问题:然而

  • 注意如果您的应用程序是向前锁定(这是不可避免的开始JB,由于应用程序加密所有付费应用程序),那么这将无法工作becau SE您的应用程序的可执行文件是不会被别人读取

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

+1

您可以将其从/ data/app复制到存储卡。尽管无法浏览该目录,但它所包含的文件通常是可读的 - 尽管这并不能保证(并且这并不总是安装位置)。另一种选择可能是不使用权限系统,但尝试对请求的包进行自己的认证。 –

+0

谢谢克里斯 - 我的应用程序需要安装在设备上,否则它将无法正常工作,所以我对用户安装位置的最小担心。我认为这是你所指的唯一考虑因素?另外,由于/ data/app是可读的,我可以检查apk是否位于其他位置之前。从我的搜索中,我无法找到一种方法来从该位置传输apk,除非使用根函数......想知道是否有方法...我不确定您的“自己的身份验证”是什么意思?干杯。 – brandall

+0

如果它是可读的(就像它通常那样),则不需要root将其复制到允许写入的地方(例如具有适当清单许可的sdcard)。但是,/ data/app并不总是被安装的地方。有时apk文件名在安装过程中发生变化。您可以从/data/system/packages.xml中确定位置和安装的名称,但此时您对私有内部功能的相当深入,这可能不是未来的证明。真的,重新下载可能是您最好的选择 - 至少,将其作为后备选项。 –

回答

3

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

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

  • 做任何形式从您的应用程序安装的唯一办法是要经过侧载UI,这(a)对于用户而言将是非常可怕的体验,并且(b)将要求用户开启侧载以能够继续。
  • 以这种方式安装您的应用程序可能会从Play商店中删除它的所有权(因为它不再是安装它的所有者)。这可能意味着用户不能再通过Play商店向您报告崩溃或ANR,或其他负面后果。我不确定到底会发生什么问题,但我真的不会认为这样会好起来的。

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

+0

感谢您的回答。这个问题的一个很好的例子是Tasker应用程序,它需要net.dinglisch.android.tasker.PERMISSION_RUN_TASKS。正如我确信你知道的那样,Tasker可以做一些主要的设备更改,所以开发人员为什么要把这个引入安装我的应用程序的用户的注意是可以理解的。如果我向我的用户建议他们安装Tasker以获取其兼容功能,那么会出现这种情况,即未检测到我的清单中的权限。我不确定是否可以将您的答案标记为“正确”,因为看起来似乎没有解决方案? – brandall

相关问题