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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:03