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

