Google Play App送审被拒-违反QUERY_ALL_PACKAGES权限的使用方式

3,020 阅读2分钟

7e3073113e734939a284e6fc47701980~tplv-k3u1fbpfcp-zoom-in-crop-mark_1512_0_0_0_副本.webp

1. 时间节点

2022年7月

2. 解读邮件内容

意思是App中使用的权限QUERY_ALL_PACKAGES不符合Google Play 对该权限的定义 support.google.com/googleplay/…

图片.png

接下来聊聊项目中关于这个需求以及权限的使用

3. 需求内容

抓取本地非系统App List

4. 具体使用

1、清单文件里面申明了

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
 tools:ignore="QueryAllPackagesPermission" />

2、使用此权限进行本地App List的抓取

/**
 * 获取本地App list
 */
@RequiresPermission(android.Manifest.permission.QUERY_ALL_PACKAGES)
fun getLocalAppList(packageManager: PackageManager): List<AppInfo> {
    val installApps: MutableList<BooAppInfo> = ArrayList()
    var booAppInfo: BooAppInfo
    var installedThirdApk: String
    var packageName: String
    var installTime: String
    var lastUpdateTime: String
    val packageInfoList = packageManager.getInstalledPackages(0)
    if (packageInfoList == null || packageInfoList.size == 0) {
        return installApps
    }
    for (i in packageInfoList.indices) {
        val packageInfo = packageInfoList[i] //过滤掉系统app
        if (ApplicationInfo.FLAG_SYSTEM and packageInfo.applicationInfo.flags != 0) {
            continue
        }
        installedThirdApk = packageInfo.applicationInfo.loadLabel(packageManager).toString()
        packageName = packageInfo.packageName
        try {
            if (packageInfo.applicationInfo.loadIcon(packageManager) == null) {
                continue
            }
        } catch (e: OutOfMemoryError) {
        }

        SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale("utf-8")).apply {
            installTime = this.format(packageInfo.firstInstallTime).orEmpty()
            lastUpdateTime = this.format(packageInfo.lastUpdateTime).orEmpty()
        }

        appInfo = AppInfo()
        appInfo.appName = installedThirdApk
        appInfo.packageName = packageName
        appInfo.firstInstallDate = installTime
        appInfo.lastUpdateDate = lastUpdateTime
        appInfo.versionName = packageInfo.versionName
        appInfo.versionCode = packageInfo.versionCode.toString()
        installApps.add(appInfo)
    }
    return installApps
}

3、由于此权限在Google Play 已认定为权限权限

support.google.com/googleplay/…

图片.png

4、所以在Google Play Console 已对该权限做了申明

1.png

2.png

图片.png

图片.png

图片.png

5. 解决思路

1. 去除清单中配置的权限申明,通过使用queries配置来达到抓取App List目的

去除此行代码

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
 tools:ignore="QueryAllPackagesPermission" />
    

增加此行代码

<queries>
    <intent>
        <action android:name="android.intent.action.MAIN"/>
        <!--<category android:name="android.intent.category.LAUNCHER"/>-->
    </intent>
</queries>

2. 第1步做完之后,重新打包,送审Google Play

如果最新包审核通过之后,警告还在,那么可以通过主动联系Google Play,说明下 我们已经去除了该权限,为什么警告还在,等个1天多,这个问题就解决了

官方参考文档

developer.android.com/training/pa…

3. 对抓取的App List数据影响大吗?

经过测试在之前使用QUERY_ALL_PACKAGES抓取的App List和最新使用queries配置抓取的App List相差不大,我们测试的结果在10个左右,差别的app 基本是系统级别的App,所以我们认定该方法可以替换之前的。

4. 其他不太靠谱 可以尝试的方法

还是保持原有的权限申明,重新定义在Google Play Console 的用途描述,以及重新修改用途,录制新的视频,试试。