You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

兼容Android 10及以下时,无法移除READ_CONTACTS权限的解决方案咨询

解决方案:无需停留在API35,兼容高/低版本的权限与体验方案

核心结论

别停在API35,继续升级到API level 37——通过版本区分权限声明+双逻辑实现,既能满足谷歌的权限合规要求,又能兼容Android 10及以下设备,同时解决联系人选择的体验问题。

具体实现步骤

  1. 精准声明权限,避免高版本冗余
    在AndroidManifest.xml中,给READ_CONTACTS权限添加maxSdkVersion="29"(对应Android 10),这样只有Android 10及以下的设备会看到并申请该权限,Android 11+系统会自动忽略这个权限声明,符合谷歌的权限精简要求:

    <uses-permission android:name="android.permission.READ_CONTACTS"
                    android:maxSdkVersion="29" />
    
  2. 双版本逻辑适配

    • Android 11及以上(API 30+):
      无需READ_CONTACTS权限,直接用Contacts Provider的QUERY权限(系统默认授予)查询联系人邮箱,或者使用Intent.ACTION_GET_CONTENT替代ACTION_PICK:
      val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
          type = "vnd.android.cursor.dir/email_v2"
          putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
      }
      startActivityForResult(intent, REQUEST_PICK_EMAILS)
      
      这个Intent支持多选,且只会筛选出带邮箱的联系人,用户还能直接选择具体的邮箱地址,完美解决ACTION_PICK的体验缺陷。
    • Android 10及以下(API 29-):
      保留原有逻辑:申请READ_CONTACTS权限后,读取所有邮箱地址并展示自动补全对话框。
  3. 权限申请的版本判断
    在代码中申请权限时,先判断系统版本:如果是Android 10及以下,再发起READ_CONTACTS的权限请求;高版本直接跳过这一步,进入新逻辑。

为什么不建议停在API35?

谷歌对应用上架的targetSdkVersion有强制升级要求,后续旧API版本的应用可能无法上架或收到警告。而且API37带来的系统兼容性、安全补丁支持都是停留在旧版本无法获得的,得不偿失。

内容的提问来源于stack exchange,提问作者Volker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 00:24:50