Xamarin.Android获取位置提供者始终返回空值问题求助
解决Xamarin Android中LocationProvider返回空的问题
我当初用Xamarin开发Android定位功能时,也踩过获取LocationProvider返回空的坑,结合你的代码场景,给你几个排查和解决的方向:
权限没配置到位:Android 6.0(API 23)及以上版本,位置权限属于危险权限,光在
AndroidManifest.xml里声明还不够,得动态申请。
首先检查你的Manifest里有没有添加必要权限:<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />要是你的App需要后台定位(Android 10+),还得加上
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />。
然后在代码里先检查权限状态,没授权就请求:protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 先检查权限 if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessCoarseLocation) != Permission.Granted) { ActivityCompat.RequestPermissions(this, new[] { Manifest.Permission.AccessCoarseLocation }, 1001); } else { InitializeLocationManager(); } } // 处理权限请求结果 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001 && grantResults[0] == Permission.Granted) { InitializeLocationManager(); } }Criteria条件太严格:你设置了
Accuracy.Coarse,但有些设备可能没有完全匹配的提供者。可以先放宽条件,或者直接获取所有可用的提供者来测试:public void InitializeLocationManager() { _mgr = (LocationManager)GetSystemService(LocationService); // 先获取所有可用的提供者 var availableProviders = _mgr.GetProviders(true); if (availableProviders.Any()) { // 随便取第一个测试 var provider = availableProviders.First(); // 后续逻辑 } else { // 没有可用提供者,提示用户 } }如果这样能拿到提供者,再慢慢调整Criteria的参数,比如PowerRequirement不要设得太高,比如改成
Power.Medium或者Power.Low。设备定位服务未开启:不少用户会关闭设备的定位服务,导致获取不到提供者。你可以在代码里检测定位服务状态,没开启就引导用户打开:
bool isLocationEnabled = _mgr.IsProviderEnabled(LocationManager.GpsProvider) || _mgr.IsProviderEnabled(LocationManager.NetworkProvider); if (!isLocationEnabled) { Intent openSettingsIntent = new Intent(Settings.ActionLocationSourceSettings); StartActivity(openSettingsIntent); }模拟器测试的特殊情况:如果你用模拟器测试,有些模拟器默认没开启定位功能,或者需要手动设置模拟位置。可以打开模拟器的系统设置,找到定位服务开启;或者用Android Studio的模拟器控制面板,发送模拟的经纬度数据。
内容的提问来源于stack exchange,提问作者Trevor Yokum
相关产品推荐
相关产品推荐

