如何安装存储在Android应用程序的私有存储中的apk?

时间:2011-06-16 12:09:26

标签: android permissions installer storage internal

从我的Android应用程序中,我正在从网上下载一个apk,将其存储在应用程序的私有存储中(openFileOutput(FILENAME, Context.MODE_PRIVATE))

并尝试通过这个下载的apk调用android包安装程序 intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive");
startActivity(intent);

但是我收到一个错误,说明了 Unable to open zip: /data/data/com.test/files/abc.apk : Permission denied
在LogCat中

和,
Parse Error: There is a problem parsing the package
在电话屏幕上。

是否发生这种情况是因为apk文件位于应用程序的私有存储中,因此Android程序包安装程序无法访问它?如果是的话,是否有可能仍然安装apk(当然是在用户的许可下)。或者我做错了什么?

PS:请不要假设手机有根。

3 个答案:

答案 0 :(得分:3)

除了Mark Allisons评论之外,我的GUESS是因为您使用mode_private将文件保存到私有存储,所以只有您的应用程序具有读/写权限。但是您正在尝试让包安装程序读取它,这意味着该文件必须由外部应用程序访问,因此应该是MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE。

或者您可以将其保存到外部存储中,默认情况下它是世界可读的。

答案 1 :(得分:0)

好的,现在我已经找到了解决方法(这也帮助我确认了确切的问题 - 问题是安装程序无法访问apk文件)。现在,我在使用MODE_WORLD_READABLE而不是MODE_PRIVATE同时将文件保存在内部存储中,并且android安装程序能够访问apk并且可以安装它而没有任何错误。 实际上,对我来说,使用内部存储的主要目的是用户不应该直接复制apk文件(假设一个简单的威胁模型,其中用户没有root电话,但可以通过SD卡浏览到找到apk并复制它)。虽然我现在还不确定文件是否对用户可见?我的意思是,如果可以从手机中的应用程序访问下载的apk,我(几乎)很好,但不能由用户直接复制。

如果知道MODE_WORLD_READABLE的确切范围的人可以详细说明,特别是在(无根)手机中是否可以浏览以此模式保存的文件,将会很有帮助。此外,是否有可能有更好的策略来保护apk,同时仍然允许安装程序访问它?

答案 2 :(得分:-1)

MODE_WORLD_READABLE确实说它可以被整个“手机世界”访问,因此其他应用可以获得它,包括文件浏览器。某些程序(如es-file manager)允许您查看设备专用存储上的内容,即使您没有root,但也不允许您更改这些文件。为什么不安装后立即删除apk文件?此外,由于您在应用程序中下载apk文件,我猜您不想使用Play商店,但如果这不是问题,请参阅您的应用程序的许可选项:http://developer.android.com/google/play/licensing/overview.html,因为可能有用例覆盖你的要求。

相关问题