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
相关产品推荐
相关产品推荐

