我的Xamarin.Forms应用程序上的GetLocationAsync失败。
我有最新的Xamarin.Essentials nuget软件包。
我已经在info.plist中设置了必要的权限。
我 am 从我的ViewModel调用它。
通话非常简单:
var location = await Geolocation.GetLastKnownLocationAsync();
,但这既失败又无法提示用户权限对话框,即使我的info.plist已正确设置为: NSLocationWhenInUseUsesDescription 插入原因
我之所以要回答这个问题,是因为这是一个令人头疼的问题,而且我不确定要搜索的内容还是问题所在。
我的各种搜索都指向许多相关问题,但实际上并没有解决主要问题。
我最接近的实际上是Essentials github页面上的这个问题: https://github.com/xamarin/Essentials/issues/634
答案 0 :(得分:1)
此答案的灵感来自Xamarin / Azure传播者Brandon Minnick->看看他的项目,他在以下code:
中处理类似的情况那么,我们可以从以上几点中取什么呢?如果您查看上下文,则他已将其视图与MVVM样式的ViewModels连接起来。但是,各种库要求从Main线程调用某些方法。这是问题的本质,这是此代码可以解决的问题。
因此要针对问题中解决的地理位置问题采用上述代码,我做了以下事情:
Task<Xamarin.Essentials.Location> GetLocationFromPhone()
{
var locationTaskCompletionSource = new TaskCompletionSource<Xamarin.Essentials.Location>();
Device.BeginInvokeOnMainThread(async () =>
{
locationTaskCompletionSource.SetResult(await Geolocation.GetLastKnownLocationAsync());
});
return locationTaskCompletionSource.Task;
}
我正在从TaskModel的ViewModel中使用以上内容。类似于以下内容。
async Task ExecuteGetGeoLocationCommand()
{
try
{
var locationFromPhone = await GetLocationFromPhone().ConfigureAwait(false);
if (locationFromPhone is null)
return;
_location = locationFromPhone;
if (_location != null)
{
Console.WriteLine($"Latitude: {_location.Latitude}, Longitude {_location.Longitude}, Altitude: {_location.Altitude}");
}
else
{
Console.WriteLine($"Exiting geolocation");
}
catch (FeatureNotSupportedException fnsEx)
{
}
catch (Exception ex)
{
}
}
}
希望对其他人有帮助!
答案 1 :(得分:0)
如果您使用的是Xamarin.Essentials,并且没有提示您获得Android上的权限,请确保已将所有必需的代码添加到Android Main Activity中。
有关详细信息,请参见https://docs.microsoft.com/en-us/xamarin/essentials/get-started?tabs=windows%2Candroid。
从文档中
<table style="width:100%">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
</table>
和
protected override void OnCreate(Bundle savedInstanceState) {
//...
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
//...