PackageManager#installPackage 不适用于 Android N
Posted
技术标签:
【中文标题】PackageManager#installPackage 不适用于 Android N【英文标题】:PackageManager#installPackage doesn't work for Android N 【发布时间】:2016-11-14 08:52:14 【问题描述】:当使用版本 24 的构建工具和带有 N 映像 (npd56n) 的 android 设备时,我无法使用 PackageManager#installPackage 安装包。
当带有file:
方案的URI 传递给方法时,返回-3,我假设它是INSTALL_FAILED_INVALID_URI。
当使用 FileProvider(content:
方案)创建的 URI 传递给方法时,抛出异常:
Caused by: java.lang.UnsupportedOperationException: Only file:// URIs are supported
有什么想法吗?
【问题讨论】:
FileProvider
方法对我很有效,从 NDP4 开始使用 ACTION_INSTALL_PACKAGE
。请参阅this issue 了解更多信息。
@CommonsWare,Android N PackageManager source 似乎仍然明确禁止非 file://
URI。 FileProvider
提供 content://
URI。也许您指的是通过Intent
安装而不是通过(反射)调用PackageManager.installPackage
?
@manyobject:哦,我以为installPackage()
只是调用安装程序活动的方便包装器。是的,我正在使用ACTION_INSTALL_PACKAGE
进行测试。
@mrtowel,我强烈怀疑在您的情况下 -3 返回值是因为 PackageManager 没有读取您尝试安装的文件的权限。 Changes in Android N 意味着文件权限更加严格,特别是File#setReadable(true, false)
不再足以使应用程序私有存储中的文件对其他应用程序可读,MODE_WORLD_READABLE
将抛出异常。
【参考方案1】:
PackageManager 中的 installPackage 在 N 上已弃用
【讨论】:
以上是关于PackageManager#installPackage 不适用于 Android N的主要内容,如果未能解决你的问题,请参考以下文章
PackageManager.getComponentEnabledSettings() 在冷启动之间是不是持久?
PackageManager.getPackageSizeInfo||UserHandle.myUserId()