target SDK降为22后ANSWER_PHONE_CALLS权限被拒绝问题咨询
问题根因
ANSWER_PHONE_CALLS是Android 8.0(API Level 26)才正式新增的危险权限,API26以下系统不存在该权限定义- targetSdk 低于23的自动授权规则,仅覆盖API23发布时已经存在的危险权限,API23之后新增的危险权限不受该规则约束,运行在对应版本及以上设备时默认处于拒绝状态,所以即便把targetSdk降到22,运行在API26+设备上时该权限依然会返回拒绝状态。
可行解决方案
方案1:分版本适配(无额外权限弹窗,兼容性最好)
API26以下的设备无需ANSWER_PHONE_CALLS权限即可实现接听电话逻辑,你可以加版本判断分支:
- 代码逻辑示例:
// 先判断系统版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { int res = ContextCompat.checkSelfPermission(context, Manifest.permission.ANSWER_PHONE_CALLS); if (res == PackageManager.PERMISSION_GRANTED) { // 执行接听电话逻辑 } else { // 按需选择申请权限,或引导用户手动到设置页开启 } } else { // API26以下直接执行接听逻辑,无需申请该权限 // 可通过TelecomManager或者反射ITelephony的answerRingingCall方法实现 }
- 只需在
AndroidManifest.xml中补充声明android.permission.MODIFY_PHONE_STATE权限,该权限在targetSdk22时会被系统自动授予。
方案2:手动授权适配
如果你的应用是预装应用、企业定制应用,可以申请加入系统权限白名单,ANSWER_PHONE_CALLS会在安装时自动授予;如果是普通三方应用,可以引导用户进入应用设置的权限管理页面手动开启该权限,不需要触发运行时申请弹窗。
方案3:优化权限申请体验
如果允许少量弹窗,建议将targetSdk升级到符合应用商店要求的版本(目前主流应用商店要求targetSdk不低于33),仅在首次使用通话功能时申请1次ANSWER_PHONE_CALLS权限,相比多个权限弹窗的体验影响更小,也能规避低版本targetSdk带来的其他兼容性问题。
内容的提问来源于stack exchange,提问作者xiaolin
相关产品推荐
相关产品推荐

