由于缺乏 QUERY_ALL_PACKAGES 权限,我们无法访问 Google Play。

访客 173 0

前言

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 文件中进行如下声明:

通过以下方式判断是否存在:
```

    
    
    
    

``` 
下面是修改后的文案:

```
获取上下文包管理器并通过包名获取应用程序信息。
```

解决方案三:
移除与此相关的所有代码。 

嗯...没错,我就是这样做的...

标签: 权限 解决方案 条件 存在

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~