C# Xamarin essentials地理位置不工作,GetLocationAsync中断尝试

C# Xamarin essentials地理位置不工作,GetLocationAsync中断尝试,c#,android,xamarin,xamarin.forms,xamarin.essentials,C#,Android,Xamarin,Xamarin.forms,Xamarin.essentials,所以我想得到用户的位置,并对其进行反向地理编码,得到地址加上街道号 因此,我安装了预发布的Xamarin.Essentials包。我想使用地理定位和地理编码API,所以我编写了一些代码,但在尝试GetCurrentLocation时,代码从未到达if(location!=null) 我不认为Xamarin.Essentials是基于Xam.Plugin.Geologitor作者James Montemagno所说的预发布有什么关系: 我将继续工作和维护我的插件,但我建议你检查Xamarin.Es

所以我想得到用户的位置,并对其进行反向地理编码,得到地址加上街道号

因此,我安装了预发布的Xamarin.Essentials包。我想使用地理定位和地理编码API,所以我编写了一些代码,但在尝试GetCurrentLocation时,代码从未到达
if(location!=null)

我不认为Xamarin.Essentials是基于Xam.Plugin.Geologitor作者James Montemagno所说的预发布有什么关系:

我将继续工作和维护我的插件,但我建议你检查Xamarin.Essentials,看看它是否像我所有人一样非常适合你的应用程序

资料来源:

我做了什么? 我已经搜索了有关我遇到的问题的问题,但就我所知,我找不到一个能帮助我的问题

我看到的问题是:

我还尝试了添加超时是否有效:
var request=new GeolocationRequest(geolocationaccurity.Medium,timeout:TimeSpan.MaxValue)

但我在现场也遇到了同样的问题。它从未到达if语句

我的代码:
FillingLocationForm()在我的页面构造函数中设置

公共场所和<代码>公共地标地标是在Page类中设置的

这些是Page类中的相关函数:

public异步void fillinlocationform()
{
如果(等待GetCurrentLocation())
{
如果(等待ReverseGeocodeLocation())
{
等待此消息。显示警报(“位置”,placemark.AdminArea+“”+placemark.FeatureName+“”+placemark.Locality+“”+placemark.SubLocality+“”+placemark.SubAdminArea+“”+placemark.SubThroughtrea+“”+placemark.Throughtree,“好的”,“好的”);
}
}           
}
公共异步任务GetCurrentLocation()
{
尝试
{
var请求=新地理定位请求(geolocationaccurity.Medium);
var location=await Geolocation.GetLocationAsync(请求);
如果(位置!=null)
{                    
这个位置=位置;
返回等待任务。FromResult(true);
}
}
捕获(功能不支持异常fnsEx)
{
//设备异常不支持句柄
}
捕获(许可异常pEx)
{
//处理权限异常
}
捕获(例外情况除外)
{
//无法获取位置
}
返回等待任务。FromResult(false);
}
公共异步任务ReverseGeocodeLocation()
{
尝试
{
var lat=位置、纬度;
var lon=位置。经度;
var placemarks=await Geocoding.GetPlacemarksAsync(lat,lon);
var placemark=placemarks?.FirstOrDefault();
if(placemark!=null)
{
//地理编码地址=
//$“AdminArea:{placemark.AdminArea}\n”+
//$“CountryCode:{placemark.CountryCode}\n”+
//$“CountryName:{placemark.CountryName}\n”+
//$“FeatureName:{placemark.FeatureName}\n”+
//$“位置:{placemark.Locality}\n”+
//$“PostalCode:{placemark.PostalCode}\n”+
//$“SubAdminArea:{placemark.SubAdminArea}\n”+
//$“子局部性:{placemark.SubLocality}\n”+
//$“次通道:{placemark.subthoroughe}\n”+
//$“通道:{placemark.thoroughure}\n”;
//控制台写入线(地理编码地址);
this.placemark=placemark;
返回等待任务。FromResult(true);
}
}
捕获(功能不支持异常fnsEx)
{
//设备上不支持此功能
}
捕获(例外情况除外)
{
//处理地理编码中可能发生的异常
}
返回等待任务。FromResult(false);
}
我还将这些权限添加到我的应用程序AndroidManifest中,并在运行时请求它们。我已在我的应用程序设置中看到位置和存储都被选中:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />
编辑3: 下图中的断点永远不会被触发,这意味着永远不会到达if语句。不知何故,代码退出了try,但没有进入catch语句。我现在在catch语句中使用
Console.WriteLine()
。我在设备日志中看不到任何内容。我测试了一个
Console.WriteLine()
,不符合我在设备日志中看到的捕获。
显然,我没有等太久。就像杰森说的

我第一次尝试添加超时是:

new GeolocationRequest(GeolocationAccuracy.Medium, timeout: TimeSpan.MaxValue);
不知怎的,上面的那条线不起作用了

无论如何,添加10秒的时间跨度给了我一个位置:

var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));       

在我的情况下,在“位置设置”下打开手机的“提高准确性”选项会有所帮助;至少对于安卓来说是这样。

在屏幕截图中,断点位于第一行,这意味着它尚未执行,因此变量当然为空。如果转到下一行,请求是否仍然为空?是否已明确授予应用程序位置权限?如果你进入手机设置->应用->[应用名称]->权限,位置是否启用?@Jason请求最终还是包含了一些内容。我已经改变了我的问题。如果(location!=null)
,则代码永远不会进入
@汤姆:我已经看到位置启用了。你要等多久?您确定没有抛出异常吗?您正在捕获异常,但没有对它们执行任何操作。你在考试吗
var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));