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

Android 12设备触发SecurityException报错的解决方案咨询

解决方案

1. 确认用户已授予精确位置权限

Android 12(API 31)开始,位置权限弹窗合并了ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION,用户可选择授予「大致位置」或「精确位置」。即便你在Manifest中声明了ACCESS_FINE_LOCATION且发起了运行时申请,若用户选择了「大致位置」,应用实际仅拥有ACCESS_COARSE_LOCATION权限,调用GPS_PROVIDER(仅支持精确位置)就会触发SecurityException。

在调用位置更新前,务必检查ACCESS_FINE_LOCATION的授权状态:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    if(isGpsEnable(LocationManager.GPS_PROVIDER)) {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsListener);
    }
} else {
    // 重新发起精确位置权限申请
    ActivityResultContracts.RequestPermission requestPermission = new ActivityResultContracts.RequestPermission();
    activityResultLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION);
}

2. 后台位置更新需额外申请ACCESS_BACKGROUND_LOCATION权限

如果应用在后台状态下仍需接收GPS位置更新,Android 12及以上系统要求必须声明并申请ACCESS_BACKGROUND_LOCATION权限:

  • 先在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
  • 运行时单独申请该权限(需在用户已授予前台位置权限后发起):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityResultContracts.RequestPermission requestBackgroundPermission = new ActivityResultContracts.RequestPermission();
        backgroundPermissionLauncher.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
    }
}

3. 添加异常捕获与兼容处理

为避免崩溃,可在调用位置更新时添加异常捕获,同时兼容不同系统版本的权限逻辑:

try {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        if(isGpsEnable(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsListener);
        }
    }
} catch (SecurityException e) {
    // 处理权限异常,比如提示用户开启精确位置权限
    Log.e("LocationError", "权限不足:" + e.getMessage());
}

内容的提问来源于stack exchange,提问作者swiftbegineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:26