当前位置: 首页 > news >正文

Android 11 (API 30) 及更高版本中,查询的特定应用商店包,无需动态请求权限处理

在 Android 11 (API 30) 及更高版本中,通过在 AndroidManifest.xml 中添加

 <queries>

元素声明需要查询的特定应用商店包名后:

1. 不需要额外请求权限 (如 QUERY_ALL_PACKAGES )即可查询这些应用的安装状态
2. 这是 Google 官方推荐的替代方案,完全符合隐私政策要求
具体说明:

1. 优势 :
  •  无需动态请求权限
  • 不会触发 Google Play 的隐私审核问题
  • 仅能查询明确声明的包名,更安全
2. 实现方式 :


   在 AndroidManifest.xml 中添加如下内容:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <queries>
        <!-- 华为应用商店 -->
        <package android:name="com.huawei.appmarket" />
        <!-- 小米应用商店 -->
        <package android:name="com.xiaomi.market" />
        <!-- OPPO应用商店 -->
        <package android:name="com.oppo.market" />
        <package android:name="com.heytap.market" />
        <!-- VIVO应用商店 -->
        <package android:name="com.bbk.appstore" />
        <!-- 魅族应用市场 -->
        <package android:name="com.meizu.mstore" />
        <!-- 荣耀应用商店 -->
        <package android:name="com.hihonor.appmarket" />
        <!-- 腾讯应用宝 -->
        <package android:name="com.tencent.android.qqdownloader" />
        <!-- 360手机助手 -->
        <package android:name="com.qihoo.appstore" />
        <!-- 百度手机助手 -->
        <package android:name="com.baidu.appsearch" />
        <!-- 其他应用商店... -->

    </queries>
</manifest>
3. 代码查询方式 :


   可以简化查询逻辑,直接检查特定包名:

public static List<String> checkHasInsatllAppStores(Context context) {
    List<String> list = new ArrayList<>();
    PackageManager pm = context.getPackageManager();
    
    for (String pkg : STORE_PACKAGES) {
        try {
            pm.getPackageInfo(pkg, PackageManager.GET_ACTIVITIES);
            list.add(pkg);
        } catch (PackageManager.NameNotFoundException e) {
            // 应用未安装
        }
    }
    return list;
}
4.典型使用场景 :
try {
    // 查询微信是否安装
    PackageInfo info = pm.getPackageInfo("com.tencent.mm", PackageManager.GET_ACTIVITIES);
    Log.d("App", "微信版本:" + info.versionName); 
} catch (PackageManager.NameNotFoundException e) {
    // 应用未安装
}


4. 注意事项 :

  •    此方案在 Android 11+ 是必须的
  •    在 Android 10 及以下版本会自动生效
  •    只能查询明确声明的包名
  •    需要确保 <queries> 中包含了所有需要检测的应用商店包名
  •   需要声明 <queries> 或权限(Android 11+)
  •   主线程调用可能引发ANR,建议在子线程执行
  •    捕获 NameNotFoundException 是必须的


这种方案既解决了权限问题,又符合 Google Play 的隐私政策要求,是当前查询特定应用安装状态的最佳实践。

http://www.dtcms.com/a/121718.html

相关文章:

  • MyBatis 详解及代码示例
  • 机器学习--数据填充
  • 楼宇自控系统构建机电设备管理新方式,提升建筑管理水平
  • 【C++进阶】关联容器:set类型
  • Python 3.x cxfreeze打包exe教程
  • LeetCode 解题思路 35(Hot 100)
  • 如何理解KMP算法中的next数组
  • 气象水文耦合模式 WRF-Hydro 建模技术与案例实践应用
  • [leetcode]差分算法
  • FPGA_DDR错误总结
  • Spring Boot 应用中如何避免常见的 SQL 性能问题
  • C++学习之套接字并发服务器
  • 砍树(二分)
  • 搜广推校招面经七十一
  • 示波器直流耦合与交流耦合:何时使用哪种?
  • Spring Boot 中集成 Knife4j:解决文件上传不显示文件域的问题
  • [漏洞篇]SSRF漏洞详解
  • 华为网路设备学习-17
  • 即时通讯软件BeeWorks,企业如何实现细粒度的权限控制?
  • PostgreSQL-数据库的索引 pg_operator_oid_index 损坏
  • JAVAWeb_Servlet:前置准备与理论简易介绍
  • input_ids ,attention_mask 是什么
  • js解除禁止复制、禁止鼠标右键效果
  • 阿里发布实时数字人项目OmniTalker,实时驱动技术再突破~
  • json 转 txt 用于 yolo 训练(可适用多边形标注框_python)
  • HOW - React Developer Tools 调试器
  • SpringBoot和微服务学习记录Day1
  • 决策树+泰坦尼克号生存案例
  • 强化学习原理一
  • 本地部署 opik