Android Studio运行提示GPS定位需ACCESS_FINE_LOCATION权限报错怎么解决
Android定位权限报错解决方案
你遇到的报错核心原因是Android 6.0(API等级23)及以上系统中,定位属于危险权限,仅在AndroidManifest.xml中声明不够,必须完成动态授权流程才能调用定位接口,再加上你的代码存在逻辑漏洞,所以即便声明了权限依然报错。
具体问题点
- 权限检查逻辑没有拦截未授权的分支:你现在的代码中,权限检查的if块里只有TODO注释,即便检测到没有权限,代码依然会继续执行后面的
lm.getLastKnownLocation逻辑,直接触发权限报错。 - 没有实现动态权限申请的完整流程:没有主动弹出权限申请弹窗让用户手动授权。
修复步骤
1. 先在Activity中定义权限请求常量
// 定位权限请求码,可自定义 private static final int LOCATION_PERMISSION_REQUEST_CODE = 100; // 需要申请的定位权限数组 private static final String[] LOCATION_PERMISSIONS = { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION };
2. 修改权限检查逻辑,只有授权后才执行定位操作
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 检查是否已获得定位权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 未获得权限,发起动态权限申请 ActivityCompat.requestPermissions(this, LOCATION_PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE); return; // 直接返回,不执行后续定位逻辑,避免报错 } // 已获得权限,执行定位逻辑 Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
3. 重写权限申请结果回调,处理用户的授权操作
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { // 判断用户是否同意了所有权限申请 boolean allGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } if (allGranted) { // 用户授权成功,重新执行定位逻辑 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); // 后续处理定位结果的逻辑 } } else { // 用户拒绝授权,可提示用户必须开启权限才能使用定位功能 } } }
补充注意事项
- 如果你的App目标SDK版本(targetSdkVersion)≥31(Android 12),且需要使用精确定位,用到前台定位服务时需要在Manifest对应Service标签中额外添加
android:foregroundServiceType="location"属性,如果需要后台定位还要额外声明ACCESS_BACKGROUND_LOCATION权限并单独申请。 - 测试时请确保在系统弹出的权限申请弹窗中选择「允许」,如果之前选过拒绝,可以先卸载App重新安装触发权限申请流程。
内容的提问来源于stack exchange,提问作者ehssan Moosavi
相关产品推荐
相关产品推荐

