Это лучшее решение, которое я нашел на данный момент:
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
(см. документы ), который открывает страницу расширенных настроек приложения с переключениями разрешений.
Теперь возникает неприятная проблема - я обнаружил, что изменение разрешения заставит закрыть приложение в текущий момент.Я сообщаю пользователю об этом факте в первом диалоге.В случае, если это изменится в будущем, код уже подготовлен для этой альтернативы - отображается новое диалоговое окно, и пользователь может подтвердить его при изменении разрешения, а метод будет вызывать сам себя рекурсивно и пытаться снова получить доступ к библиотеке.
Конечно, я бы рекомендовал сохранить данные пользователя до закрытия приложения из-за изменения разрешений, чтобы при повторном открытии данные оставались нетронутыми и поток пользователя не нарушался.
ЭтоТакже возможно вызвать это разрешение сразу после запуска приложения, если вы действительно полагаетесь на это разрешение для его функциональности.Таким образом, вы узнаете, что у вас либо есть доступ, либо пользователь предоставит его в самом начале, так что нет никакого вреда в том, что приложение будет закрыто.
Обновление :Я нашел проблему довольно интересной, поэтому я написал пост в блоге об этом .