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

如何安装存储在android应用程序私有存储中的apk?,android,permissions,installation,storage,internal,Android,Permissions,Installation,Storage,Internal,从我的android应用程序中,我正在从web下载一个apk,并将其存储在应用程序的私有存储中(openFileOutput(FILENAME,Context.MODE_private)) 并试图通过, intent.setDataAndType(Uri.fromFile(f),“application/vnd.android.package归档”) 星触觉(意向) 但是我得到一个错误,上面写着 无法打开zip:/data/data/com.test/files/abc.apk:权限被拒绝 在日

从我的android应用程序中,我正在从web下载一个apk,并将其存储在应用程序的私有存储中
(openFileOutput(FILENAME,Context.MODE_private))

并试图通过,
intent.setDataAndType(Uri.fromFile(f),“application/vnd.android.package归档”)
星触觉(意向)

但是我得到一个错误,上面写着
无法打开zip:/data/data/com.test/files/abc.apk:权限被拒绝

在日志中

和,
分析错误:分析包时出现问题

在手机屏幕上

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


PS:请不要假设手机已根目录。

除了Mark Allison comment,我的猜测是,由于您已使用mode_private将文件保存到私有存储中,因此只有您的应用程序具有读/写权限。但您正试图让软件包安装程序读取它,这意味着该文件必须由外部应用程序访问,因此应该是MODE_WORLD_可读或MODE_WORLD_可写的


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

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


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

MODE_WORLD_READABLE确实说,整个“手机世界”都可以访问它,因此其他应用程序可以访问它,包括文件浏览器。有些程序(如es file manager)允许您查看设备专用存储上的内容,即使您没有根目录,但不允许您更改这些文件。为什么不在安装后立即删除apk文件呢?另外,由于您正在应用程序中下载apk文件,我猜您不想使用play store,但如果这不是一个问题,请参阅上的应用程序许可选项:因为可能存在满足您需求的用例

是否已选中“设置|应用程序设置|未知源”?除非选中此选项,否则该设备将阻止您从除Android Market之外的任何地方安装APK。您所说的私人存储是指手机的内部存储还是SD卡?无论哪种方式,您确定打开的应用程序具有访问该位置的正确应用程序权限吗?我知道SD卡访问有一个特定的设置,但我不确定内部存储。@Mark:是的,我已经这样做了,而且我已经为应用程序授予了这些权限,以及编写外部存储、INTERNET、安装软件包(尽管实际上可能不需要所有这三个)@cjstehno:那是内部存储()我知道该文件已成功保存在内部存储器中,我甚至已从应用程序中检查了文件大小。他们一定已删除此功能,因为我已尝试过该功能,但仍然出现“权限被拒绝”错误。我甚至可以看到该文件是适当的读取访问权限,bummer:(而且该标志是弃用API>17