Android 13如何在运行时获取后台位置权限?代码无弹窗求助
Android 13后台位置权限请求弹窗不显示的解决办法
核心问题原因
Android 13对后台位置权限有严格的请求顺序要求:必须先授予前台位置权限(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION),才能发起后台位置权限(ACCESS_BACKGROUND_LOCATION)的请求。你当前代码同时请求两个权限,不符合系统规则,导致后台权限的请求被忽略,弹窗无法弹出。
解决步骤及修改后代码
- Manifest权限声明检查
确保AndroidManifest.xml中同时声明前台和后台位置权限,后台权限需指定最低兼容版本:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:minSdkVersion="29" />
- 分两次请求权限
先请求前台位置权限,用户授权成功后,再单独请求后台位置权限,同时完善权限 rationale(权限说明)的处理:
fun askForLocationPermission( activity: BaseActivity, permissionGranted: (() -> Unit), permissionDenied: (() -> Unit)? = null ) { // 第一步:请求前台位置权限 Dexter.withContext(activity) .withPermission(Manifest.permission.ACCESS_FINE_LOCATION) .withListener(object : PermissionListener { override fun onPermissionGranted(p0: PermissionGrantedResponse?) { // 前台权限授权成功,发起后台权限请求 askForBackgroundLocationPermission(activity, permissionGranted, permissionDenied) } override fun onPermissionDenied(p0: PermissionDeniedResponse?) { permissionDenied?.invoke() } override fun onPermissionRationaleShouldBeShown( p0: PermissionRequest?, p1: PermissionToken? ) { // 向用户说明需要前台权限的原因,确认后继续请求 AlertDialog.Builder(activity) .setTitle("位置权限请求") .setMessage("我们需要获取您的位置信息来提供基础服务,请允许权限申请。") .setPositiveButton("允许") { _, _ -> p1?.continuePermissionRequest() } .setNegativeButton("取消") { _, _ -> p1?.cancelPermissionRequest() permissionDenied?.invoke() } .show() } }).check() } private fun askForBackgroundLocationPermission( activity: BaseActivity, permissionGranted: (() -> Unit), permissionDenied: (() -> Unit)? = null ) { // 第二步:请求后台位置权限 Dexter.withContext(activity) .withPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) .withListener(object : PermissionListener { override fun onPermissionGranted(p0: PermissionGrantedResponse?) { permissionGranted() } override fun onPermissionDenied(p0: PermissionDeniedResponse?) { permissionDenied?.invoke() } override fun onPermissionRationaleShouldBeShown( p0: PermissionRequest?, p1: PermissionToken? ) { // 向用户说明需要后台权限的原因,确认后继续请求 AlertDialog.Builder(activity) .setTitle("后台位置权限请求") .setMessage("我们需要在后台持续获取您的位置来提供专属服务,请允许权限申请。") .setPositiveButton("允许") { _, _ -> p1?.continuePermissionRequest() } .setNegativeButton("取消") { _, _ -> p1?.cancelPermissionRequest() permissionDenied?.invoke() } .show() } }).check() }
额外说明
- 如果用户拒绝过权限且勾选了“不再询问”,后续请求不会弹出系统弹窗,此时需要引导用户前往应用设置页面手动开启权限。
- 后台位置权限仅在Android 10及以上版本生效,低版本无需处理该权限。
内容的提问来源于stack exchange,提问作者Vel
相关产品推荐
相关产品推荐

