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

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>就够了,效果完全一致。

二、代码层面的优化建议(可选,但能提升用户体验)

你的代码逻辑基本没问题,但有几个细节可以完善,避免崩溃或体验不佳:

  1. 补全权限回调后的逻辑
    你当前的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;
        }
    }
}
  1. 给获取定位的方法加空指针防护
    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();
}

三、验证步骤

  1. 把修正后的Manifest替换掉原来的文件
  2. 清理项目缓存(Android Studio里点Build -> Clean Project)
  3. 卸载旧APP,重新安装到设备上
  4. 启动APP后,应该会立刻弹出定位权限请求对话框

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:51:03