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

未使用ContextCompat的Android权限问题:RequestLocationUpdates崩溃

问题分析与解决方案

嘿,我来帮你捋清楚这个问题——你遇到的崩溃本质是Android 6.0(API 23)及以上版本的动态权限要求,哪怕你已经在Manifest里声明了位置权限,也绕不开这一步,和你用不用ContextCompat没关系,它只是简化操作的工具类而已。

核心原因

位置权限(尤其是ACCESS_FINE_LOCATION,因为你用的是GpsProvider)属于Android的危险权限,这类权限从API 23开始,必须在App运行时主动向用户申请,用户同意后才能使用相关功能。直接调用RequestLocationUpdates而没做权限检查,就会触发崩溃。

具体解决步骤

1. 先做权限检查,再调用定位方法

在执行RequestLocationUpdates之前,先判断当前是否已获得权限:

// 检查ACCESS_FINE_LOCATION权限(GPS定位需要这个)
if (ContextCompat.CheckSelfPermission(mainActivity, Manifest.Permission.AccessFineLocation) != Permission.Granted)
{
    // 未授权,发起动态申请
    ActivityCompat.RequestPermissions(mainActivity, new string[] { Manifest.Permission.AccessFineLocation }, 1001);
    return;
}
// 已授权,执行定位请求
nativeLocationManager.RequestLocationUpdates(NativeLocationManager.GpsProvider, 0, 0, nativeLocationListener);

2. 处理用户的权限选择回调

在你的Activity里重写OnRequestPermissionsResult方法,处理用户同意/拒绝权限后的逻辑:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1001) // 对应申请时的请求码
    {
        if (grantResults.Length > 0 && grantResults[0] == Permission.Granted)
        {
            // 用户同意权限,现在可以启动定位
            nativeLocationManager.RequestLocationUpdates(NativeLocationManager.GpsProvider, 0, 0, nativeLocationListener);
        }
        else
        {
            // 用户拒绝权限,提示用户开启权限才能使用功能
            Toast.MakeText(this, "需要开启位置权限才能获取GPS信息哦", ToastLength.Short).Show();
        }
    }
}

3. 再确认Manifest权限配置正确

虽然你说已经配置了,但还是再核对一下,确保Manifest里有这两行:

<!-- GPS定位需要的精细位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 如果需要网络辅助定位,再加这个 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

不想用ContextCompat?也可以自己判断API版本

如果你不想依赖ContextCompat,可以手动判断系统版本来处理:

if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
{
    if (CheckSelfPermission(Manifest.Permission.AccessFineLocation) != Permission.Granted)
    {
        RequestPermissions(new string[] { Manifest.Permission.AccessFineLocation }, 1001);
        return;
    }
}
// 低于API23的设备,直接执行定位请求
nativeLocationManager.RequestLocationUpdates(NativeLocationManager.GpsProvider, 0, 0, nativeLocationListener);

总的来说,你遗漏的就是运行时动态申请危险权限这一步,补上之后应该就能解决崩溃问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:58:33