兼容Android 10及以下时,无法移除READ_CONTACTS权限的解决方案咨询
解决方案:无需停留在API35,兼容高/低版本的权限与体验方案
核心结论
别停在API35,继续升级到API level 37——通过版本区分权限声明+双逻辑实现,既能满足谷歌的权限合规要求,又能兼容Android 10及以下设备,同时解决联系人选择的体验问题。
具体实现步骤
精准声明权限,避免高版本冗余
在AndroidManifest.xml中,给READ_CONTACTS权限添加maxSdkVersion="29"(对应Android 10),这样只有Android 10及以下的设备会看到并申请该权限,Android 11+系统会自动忽略这个权限声明,符合谷歌的权限精简要求:<uses-permission android:name="android.permission.READ_CONTACTS" android:maxSdkVersion="29" />双版本逻辑适配
- Android 11及以上(API 30+):
无需READ_CONTACTS权限,直接用Contacts Provider的QUERY权限(系统默认授予)查询联系人邮箱,或者使用Intent.ACTION_GET_CONTENT替代ACTION_PICK:
这个Intent支持多选,且只会筛选出带邮箱的联系人,用户还能直接选择具体的邮箱地址,完美解决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)ACTION_PICK的体验缺陷。 - Android 10及以下(API 29-):
保留原有逻辑:申请READ_CONTACTS权限后,读取所有邮箱地址并展示自动补全对话框。
- Android 11及以上(API 30+):
权限申请的版本判断
在代码中申请权限时,先判断系统版本:如果是Android 10及以下,再发起READ_CONTACTS的权限请求;高版本直接跳过这一步,进入新逻辑。
为什么不建议停在API35?
谷歌对应用上架的targetSdkVersion有强制升级要求,后续旧API版本的应用可能无法上架或收到警告。而且API37带来的系统兼容性、安全补丁支持都是停留在旧版本无法获得的,得不偿失。
内容的提问来源于stack exchange,提问作者Volker
相关产品推荐
相关产品推荐

