.NET MAUI GeolocationRequest配置问题:无法获取位置且应用无响应
问题分析与解决方案
核心代码问题
你的代码直接调用GetLocationAsync后用.Result同步等待,这会触发死锁:UI线程被阻塞等待异步操作完成,而异步操作又依赖UI线程上下文,最终导致程序卡住,这就是调试无法越过该行、应用无响应的根本原因。
修复后的代码
将方法改为异步实现,用await替代.Result避免死锁:
private async Task GetAndDisplayLocationAsync() { labelLatLong.Text = "Checking Lat Long. Please wait..."; var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(15)); using var cts = new CancellationTokenSource(); try { var location = await Geolocation.GetLocationAsync(request, cts.Token); if (location != null) { labelLatLong.Text = $"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}"; } else { labelLatLong.Text = "No location data received."; } } catch (Exception ex) { labelLatLong.Text = $"Unable to get location: {ex.Message}"; } }
调用时需使用await GetAndDisplayLocationAsync();,且调用该方法的上层方法也要标记为async。
需要检查的设置项
- 模拟器定位配置
- 打开模拟器右侧的Extended Controls(三个点图标),进入
Location选项卡 - 手动输入经纬度或选择预设位置,点击
Send将定位数据推送至模拟器 - 确认模拟器系统设置→位置中,“使用位置”已开启
- 打开模拟器右侧的Extended Controls(三个点图标),进入
- Android权限配置
- 检查
AndroidManifest.xml是否声明了必要权限:<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12+ 额外权限 --> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> - Android 13+ 需确保已声明
ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION,若使用后台定位还需ACCESS_BACKGROUND_LOCATION
- 检查
- 模拟器与VS连接状态
- 确认模拟器已完全启动,Visual Studio设备管理器中显示其处于“Running”状态
- 重启模拟器和Visual Studio,排除连接异常问题
- 定位模式设置
- 在模拟器位置设置中,将定位模式设为“高准确度”(结合GPS、Wi-Fi和移动网络),避免仅依赖GPS导致无法获取位置
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

