Как запросить разрешения, когда нет в потоке пользовательского интерфейса? - PullRequest
0 голосов
/ 16 апреля 2020

В настоящее время я использую последнюю версию Xamarin.Forms (4.5.0.617) и Xamarin.Essentials (1.5.2).

У меня есть служба внедрения зависимостей, которая отвечает за получение доступа к телефону контакты, это фактически обертка вокруг кода разрешений Xamarin.Essentials. Мне нужно гарантировать, что код выполняется в потоке пользовательского интерфейса, чтобы избежать исключений. Я дошел до приведенного ниже кода, однако, он не работает так, как я ожидал. В моем приложении появляется всплывающее окно с разрешениями, которое дает мне возможность разрешить / запретить, но затем весь код после RequestAsyn c не выполняется, так как ответ никогда официально не возвращается. В следующий раз, когда я запускаю приложение, оно работает сразу (так что, вероятно, разрешение в фоновом режиме было правильно записано).

public async Task<bool> RequestAccessPhoneContacts()
{
    PermissionStatus status = PermissionStatus.Denied;

    status = await MainThread.InvokeOnMainThreadAsync<PermissionStatus>(async () =>
    {
        return await Permissions.RequestAsync<Permissions.ContactsRead>();
    });

    return (status == PermissionStatus.Granted);
}

Я не уверен, что вызвал проблему с тем, как я я пытаюсь принудительно ввести код в поток пользовательского интерфейса или неправильно использую код asyn c ... или (наименее вероятно), является ли это ошибкой в ​​коде разрешений Xamarin.Essentials. Я только видел это поведение на Android в данный момент, но я не проверял его ни на каких других.

Любая помощь с благодарностью:)

спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Оказывается, я не следовал документации должным образом при настройке.

После добавления этого в мою основную деятельность все возвращается к жизни.

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Эта информация пришла от меня, когда я поднял ошибку на github Xamarin.Essentials - https://github.com/xamarin/Essentials/issues/1227

...