Android 6.0定位权限请求无弹窗问题排查与解决求助
为何定位权限请求未触发?问题排查与修复方案
兄弟,我一眼就揪出问题根源了——你的Manifest权限声明位置完全错误,这直接导致系统根本识别不到你的权限请求,自然不会弹出授权对话框。你复制的官方代码本身没问题,但Manifest的写法踩了一个很容易忽略的坑。
一、核心问题:权限声明放错位置了!
你把<uses-permission-sdk-23>嵌套在了<application>标签内部,但Android的规则是:所有权限声明必须放在<manifest>标签的直接子节点下,绝对不能放在<application>里面。这个错误会让系统认为你的APP根本没有申请定位权限,所以不会触发授权弹窗。
修正后的完整Manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="church.eastjordan.circle"> <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" android:maxSdkVersion="23" /> <!-- 权限声明必须放在这里!manifest的直接子节点 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
另外提一句:<uses-permission-sdk-23>是旧的兼容标签,针对API23+的设备,直接用<uses-permission>就够了,效果完全一致。
二、代码层面的优化建议(可选,但能提升用户体验)
你的代码逻辑基本没问题,但有几个细节可以完善,避免崩溃或体验不佳:
- 补全权限回调后的逻辑
你当前的onRequestPermissionsResult里,权限授予后啥都没做,用户看不到反馈,建议补充:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_LOCATION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予成功,更新UI提示用户 Toast.makeText(this, "定位权限已授予", Toast.LENGTH_SHORT).show(); latitudeString = "权限已就绪,可点击获取定位"; longitudeString = "权限已就绪,可点击获取定位"; } else { Toast.makeText(this, "定位权限被拒绝,无法获取位置信息", Toast.LENGTH_SHORT).show(); latitudeString = "权限被拒绝"; longitudeString = "权限被拒绝"; } UpdateText(); return; } } }
- 给获取定位的方法加空指针防护
getLastKnownLocation很可能返回null(比如设备从未开过GPS,或者长时间没定位),不加判断会直接崩溃,所以要加防护:
public void GetLocation(View view) { // 先检查权限,避免用户没授权就点击 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "请先授予定位权限", Toast.LENGTH_SHORT).show(); return; } LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { double longitude = location.getLongitude(); double latitude = location.getLatitude(); latitudeString = Double.toString(latitude); longitudeString = Double.toString(longitude); } else { latitudeString = "未获取到有效定位"; longitudeString = "未获取到有效定位"; } UpdateText(); }
三、验证步骤
- 把修正后的Manifest替换掉原来的文件
- 清理项目缓存(Android Studio里点
Build -> Clean Project) - 卸载旧APP,重新安装到设备上
- 启动APP后,应该会立刻弹出定位权限请求对话框
内容的提问来源于stack exchange,提问作者Truth
相关产品推荐
相关产品推荐

