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

