Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.forms Xamarin表单中的地理位置GetLastKnownLocationAsync()权限异常-调用失败且没有权限提示_Xamarin.forms_Geolocation_Xamarin.essentials - Fatal编程技术网

Xamarin.forms Xamarin表单中的地理位置GetLastKnownLocationAsync()权限异常-调用失败且没有权限提示

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

GetLocationAsync在我的Xamarin.Forms应用程序上失败

我有最新的Xamarin.Essentials nuget套装

我已在info.plist中设置了必要的权限

我从我的ViewModel调用这个

这个电话非常简单:

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);
}