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

ActivityCompat.requestPermissions申请ACCESS_FINE_LOCATION无权限弹窗问题

问题根因及解决方案

1. 首要错误:Manifest权限声明格式错误

你在Manifest中声明定位权限时使用了错误的命名空间:

<!-- 错误写法,Manifest中系统权限不需要带.Manifest段 -->
<uses-permission android:name="android.Manifest.permission.ACCESS_FINE_LOCATION" />

AndroidManifest内的系统权限统一使用android.permission前缀,你多加的.Manifest段导致系统无法识别到应用已经声明定位权限,申请权限时会直接返回拒绝,不会弹出授权弹窗。

修正写法:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

同时建议删除Manifest中重复且错误的读手机状态权限声明:

<!-- 删掉这条错误的重复声明 -->
<uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" />

2. 逻辑缺失:未持有定位回调、未处理授权结果

你当前在onGeolocationPermissionsShowPrompt中申请权限后,没有暂存传入的GeolocationPermissions.Callback实例,也没有在Activity的onRequestPermissionsResult回调中根据授权结果触发该回调,就算权限申请成功,WebView也拿不到定位授权结果。

修正方案:

  • 首先在Activity中声明全局变量暂存origin和callback实例:
private String mGeoOrigin;
private GeolocationPermissions.Callback mGeoCallback;
  • 修改onGeolocationPermissionsShowPrompt逻辑:
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
    mGeoOrigin = origin;
    mGeoCallback = callback;
    int permissionCheck = ContextCompat.checkSelfPermission(onActivity, android.Manifest.permission.ACCESS_FINE_LOCATION);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(onActivity, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, MainActivity.REQUEST_GEOLOCATION);
    }else{
        callback.invoke(origin, true, false);
    }
}
  • 重写Activity的onRequestPermissionsResult,处理定位授权结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MainActivity.REQUEST_GEOLOCATION) {
        if (mGeoCallback != null) {
            boolean isGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
            mGeoCallback.invoke(mGeoOrigin, isGranted, false);
            // 用完清空避免内存泄漏
            mGeoCallback = null;
            mGeoOrigin = null;
        }
    }
}

3. 可选适配:targetSdkVersion 29+场景兼容

如果你的应用存在后台场景触发定位的需求,还需要补充声明后台定位权限:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

仅前台场景使用定位不需要新增该权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:24:03