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

Android 13如何在运行时获取后台位置权限?代码无弹窗求助

Android 13后台位置权限请求弹窗不显示的解决办法

核心问题原因

Android 13对后台位置权限有严格的请求顺序要求:必须先授予前台位置权限(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION),才能发起后台位置权限(ACCESS_BACKGROUND_LOCATION)的请求。你当前代码同时请求两个权限,不符合系统规则,导致后台权限的请求被忽略,弹窗无法弹出。

解决步骤及修改后代码

  1. Manifest权限声明检查
    确保AndroidManifest.xml中同时声明前台和后台位置权限,后台权限需指定最低兼容版本:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission 
    android:name="android.permission.ACCESS_BACKGROUND_LOCATION" 
    android:minSdkVersion="29" />
  1. 分两次请求权限
    先请求前台位置权限,用户授权成功后,再单独请求后台位置权限,同时完善权限 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:55:12