Xamarin.forms Xamarin表单中的地理位置GetLastKnownLocationAsync()权限异常-调用失败且没有权限提示
GetLocationAsync在我的Xamarin.Forms应用程序上失败 我有最新的Xamarin.Essentials nuget套装 我已在info.plist中设置了必要的权限 我从我的ViewModel调用这个 这个电话非常简单:Xamarin.forms Xamarin表单中的地理位置GetLastKnownLocationAsync()权限异常-调用失败且没有权限提示,xamarin.forms,geolocation,xamarin.essentials,Xamarin.forms,Geolocation,Xamarin.essentials,GetLocationAsync在我的Xamarin.Forms应用程序上失败 我有最新的Xamarin.Essentials nuget套装 我已在info.plist中设置了必要的权限 我从我的ViewModel调用这个 这个电话非常简单: var location = await Geolocation.GetLastKnownLocationAsync(); 但是,即使my info.plist已使用以下各项正确设置,它也会失败并无法提示用户权限对话框: NSLocationWhenU
var location = await Geolocation.GetLastKnownLocationAsync();
但是,即使my info.plist已使用以下各项正确设置,它也会失败并无法提示用户权限对话框:
NSLocationWhenUse用途说明
插入原因
我问和回答这个问题是因为这是一个让人头疼的问题,我不确定要寻找什么或者问题是什么
我的各种搜索指向许多相关的问题,但实际上没有找到主要问题
我得到的最接近的信息实际上是Essentials github页面上的这个问题:
这个答案的灵感来源于Xamarin/Azure福音传道者Brandon Minnick-->看看他的项目,他处理了以下类似情况 那么,我们可以从上面得到什么呢?如果您查看上下文,他已将其视图与MVVM样式的ViewModels连接起来。但是,各种库要求从主线程调用某些方法。这是问题的本质,这也是这段代码可以解决的问题 因此,为了采用上述代码解决问题中提到的地理位置问题,我做了以下工作:
Task<Xamarin.Essentials.Location> GetLocationFromPhone()
{
var locationTaskCompletionSource = new TaskCompletionSource<Xamarin.Essentials.Location>();
Device.BeginInvokeOnMainThread(async () =>
{
locationTaskCompletionSource.SetResult(await Geolocation.GetLastKnownLocationAsync());
});
return locationTaskCompletionSource.Task;
}
我希望这对其他人有帮助 如果您使用的是Xamarin.Essentials,并且没有提示您在Android上获得权限,请确保已将所有必需的代码添加到Android主活动中 有关详细信息,请参阅 从文档中:
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
//...
及
你可以标记你的答案,让更多的人看到它。
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
//...
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}