Как проверить, предоставил ли пользователь приложение для папки с изображениями? - PullRequest
0 голосов
/ 24 января 2019

Манифест моего приложения UWP уже запрашивает это разрешение. Однако иногда кажется (возможно, начиная с Windows 1809), что не предоставляется автоматически. Скорее, пользователю нужно открыть расширенные параметры приложения на панели управления и установить его.

Так есть ли способ проверить, есть ли у приложения разрешения для уведомления пользователя?

Вот что я имею в виду: Настройки > Приложения > (Нажмите на приложение) > Нажмите " Дополнительные параметры ". Также имейте в виду, что некоторые приложения могут не требовать каких-либо разрешений, поэтому вы можете их не видеть. Проверьте приложение погоды MS, для этого нужно два разрешения.

screenshot

1 Ответ

0 голосов
/ 29 января 2019

Это лучшее решение, которое я нашел на данный момент:

private async Task<StorageLibrary> TryAccessLibraryAsync(KnownLibraryId library)
{
    try
    {
        return await StorageLibrary.GetLibraryAsync(library);
    }
    catch (UnauthorizedAccessException)
    {
        //inform user about missing permission and ask to grant it
        MessageDialog requestPermissionDialog =
            new MessageDialog($"The app needs to access the {library}. " +
                       "Press OK to open system settings and give this app permission. " +
                       "If the app closes, please reopen it afterwards. " +
                       "If you Cancel, the app will have limited functionality only.");
        var okCommand = new UICommand("OK");
        requestPermissionDialog.Commands.Add(okCommand);
        var cancelCommand = new UICommand("Cancel");
        requestPermissionDialog.Commands.Add(cancelCommand);
        requestPermissionDialog.DefaultCommandIndex = 0;
        requestPermissionDialog.CancelCommandIndex = 1;

        var requestPermissionResult = await requestPermissionDialog.ShowAsync();
        if (requestPermissionResult == cancelCommand)
        {
            //user chose to Cancel, app will not have permission
            return null;
        }

        //open app settings to allow users to give us permission
        await Launcher.LaunchUriAsync(new Uri("ms-settings:appsfeatures-app"));

        //confirmation dialog to retry
        var confirmationDialog = new MessageDialog(
              $"Please give this app the {library} permission.");
        confirmationDialog.Commands.Add(okCommand);
        await confirmationDialog.ShowAsync();

        //retry
        return await TryAccessLibraryAsync(library);
    }
}

Что он делает, так это сначала пытается получить указанную библиотеку по ее KnownLibraryId.Если пользователь удалил разрешение приложения, оно завершится ошибкой с UnauthorizedAccessException.

. Теперь мы показываем пользователю MessageDialog, который объясняет проблему и просит его дать разрешение приложению.

Если пользователь нажимает Отмена , метод вернет null, поскольку пользователь не предоставил нам разрешение.

В противном случае мы запускаем Настройки , используя специальный URI запуска ms-settings:appsfeatures-app (см. документы ), который открывает страницу расширенных настроек приложения с переключениями разрешений.

Теперь возникает неприятная проблема - я обнаружил, что изменение разрешения заставит закрыть приложение в текущий момент.Я сообщаю пользователю об этом факте в первом диалоге.В случае, если это изменится в будущем, код уже подготовлен для этой альтернативы - отображается новое диалоговое окно, и пользователь может подтвердить его при изменении разрешения, а метод будет вызывать сам себя рекурсивно и пытаться снова получить доступ к библиотеке.

Конечно, я бы рекомендовал сохранить данные пользователя до закрытия приложения из-за изменения разрешений, чтобы при повторном открытии данные оставались нетронутыми и поток пользователя не нарушался.

ЭтоТакже возможно вызвать это разрешение сразу после запуска приложения, если вы действительно полагаетесь на это разрешение для его функциональности.Таким образом, вы узнаете, что у вас либо есть доступ, либо пользователь предоставит его в самом начале, так что нет никакого вреда в том, что приложение будет закрыто.

Обновление :Я нашел проблему довольно интересной, поэтому я написал пост в блоге об этом .

...