我的UWP应用的清单已经请求该权限。但是,似乎有时(也许自Windows 1809起)没有自动授予权限。相反,用户需要从控制面板中打开应用的高级选项并进行设置。
那么有没有一种方法可以检查应用程序是否具有权限以通知用户?
这是我的意思:设置> 应用> (单击应用)>单击“ 高级选项”。另外请记住,某些应用可能不需要任何权限,因此您可能看不到任何权限。检出MS weather app,它需要两个权限。
答案 0 :(得分:4)
这是到目前为止我发现的最好的解决方案:
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
来说明问题并要求他授予应用许可。
如果用户按下 Cancel (取消),该方法将返回null
,因为该用户未授予我们权限。
否则,我们使用特殊的启动URI ms-settings:appsfeatures-app
(请参阅docs)启动设置,该操作会使用权限开关打开应用程序高级设置页面。
现在这是一个不幸的问题-我发现更改权限将当前强制关闭应用。我在第一个对话框中告知用户这一事实。如果将来发生这种情况,则已经为该替代方法准备了代码-显示一个新对话框,用户可以在更改权限后进行确认,该方法将递归调用自身并尝试再次访问该库。>
当然,我建议您在由于权限更改而关闭应用程序之前保存用户的数据,以便在重新打开应用程序时,数据将保持不变,并且用户流不会中断。
如果您确实依赖此许可的功能,也可以在应用启动后立即调用此许可。这样一来,您便知道自己具有访问权限,或者用户会在一开始就将其授予权利,因此,该应用程序将被终止不会造成任何损害。
更新:我发现这个问题很有趣,因此我拥有written a blogpost about it。