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() 在冷启动之间是不是持久?

Android随笔之——PackageManager详解

Android随笔之——PackageManager详解

PackageManager.getPackageSizeInfo||UserHandle.myUserId()

如何在android源码中找到PackageManager类的具体实现

Android PackageManager:queryIntentActivities