前言
em…刚上班的第一天就被告知需要移除QUERY_ALL_PACKAGES
权限,以确保代码兼容性,否则将无法在Google Play上发布应用。
这个权限通常被用于判断特定应用是否已经安装:
public boolean checkAppInstall(Activity activity, String pageName) { if (!TextUtils.isEmpty(pageName)) { PackageManager packageManager = activity.getPackageManager(); List info = packageManager.getInstalledPackages(0); if (info == null || info.isEmpty()) { return false; } for (PackageInfo packageInfo : info) { if (packageInfo.packageName.equals(pageName)) { return true; } } } return false; }如果您的应用程序需要在GP上架,请查看官方说明以获取更多详细信息。此外,还需注意使用广泛的软件包(应用)可见性权限(QUERY_ALL_PACKAGES)。
解决方案一
如果无法使用
QUERY_ALL_PACKAGES
权限,那么请删除该权限并重新运行代码。本来以为会出错,但实际上并没有。经过排查,使用
packageManager.getInstalledPackages(0)
方法获取到的数据发生了变化。在删除权限之前,测试机能够获取到大约200多个数据;而在删除权限之后,只能获取到90多个。也就是说,只要你想要获取的App信息符合某些条件,在删除该权限后,并不会影响你的获取能力。这些条件可以简单地理解为:
- 自己的应用。
- 实现 Android 核心功能的某些系统软件包,例如媒体提供程序。
更多关于自动可见软件包的详细条件,请参阅原文中的「了解自动可见软件包」。
解决方案二
鉴于方案一的严格要求过于苛刻,难以满足大家的期望。例如,我们最常使用的分享功能。我建议先检查Facebook是否可用,如果可用,则显示为亮色;如果不可用,则显示为暗色。这样用户就能清楚地知道哪些应用可以进行分享,哪些应用不能进行分享了。
对于上述情况,实际上可以利用 <queries> 元素
来解决。也就是在 AndroidManifest.xml
文件中进行如下声明:
通过以下方式判断是否存在: ``` ```下面是修改后的文案: ``` 获取上下文包管理器并通过包名获取应用程序信息。 ``` 解决方案三: 移除与此相关的所有代码。嗯...没错,我就是这样做的...
还木有评论哦,快来抢沙发吧~