Android 11 权限申请弹窗不显示,API 29 模拟器运行正常是什么原因
问题原因
- Android 11(API 30)新增了位置权限申请的强制限制:不允许同时申请前台位置权限(
ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION)和后台位置权限(ACCESS_BACKGROUND_LOCATION),如果一次性提交三类权限的申请请求,系统会直接驳回请求,不会弹出授权弹窗。 - 当前代码将三类位置权限放在同一个请求中触发,刚好触发了该系统限制,因此Android 11设备上无弹窗展示。
- 额外排查点:如果之前测试过程中用户勾选了「拒绝且不再询问」选项,后续再发起同类权限申请也不会弹出弹窗。
补充说明:
FOREGROUND_SERVICE属于普通安装类权限,仅需在Manifest中声明即可,不需要动态申请,无需加入到动态权限申请列表中。
解决方案
1. 调整为分步申请权限
先申请前台位置权限,确认用户授权成功后,再单独申请后台位置权限,示例代码如下:
// 先申请前台位置权限 val REQUEST_CODE_FOREGROUND_LOCATION = 1001 val REQUEST_CODE_BACKGROUND_LOCATION = 1002 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ), REQUEST_CODE_FOREGROUND_LOCATION ) } else { ActivityCompat.requestPermissions( this, arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ), REQUEST_CODE_FOREGROUND_LOCATION ) }
// 权限申请回调中处理后续逻辑 override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { REQUEST_CODE_FOREGROUND_LOCATION -> { val isForegroundGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } if (isForegroundGranted) { // 前台权限授权成功,再申请后台位置权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { requestPermissions( arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), REQUEST_CODE_BACKGROUND_LOCATION ) } } else { // 前台权限被拒绝,根据业务逻辑处理,比如提示权限必要性、引导用户到设置页开启 } } REQUEST_CODE_BACKGROUND_LOCATION -> { // 处理后台位置权限的申请结果 } } }
2. 额外适配项
- 若检测到权限被用户永久拒绝,需弹窗说明权限的业务必要性,引导用户跳转应用设置页手动开启权限。
- 申请后台位置权限前,建议先向用户清晰说明申请该权限的使用场景,符合应用商店的权限合规要求。
内容的提问来源于stack exchange,提问作者André Nogueira
相关产品推荐
相关产品推荐

