如何检查用户是否已授予应用图片文件夹的权限?

时间:2019-01-24 19:59:49

标签: c# uwp windows-store-apps win-universal-app

我的UWP应用的清单已经请求该权限。但是,似乎有时(也许自Windows 1809起)没有自动授予权限。相反,用户需要从控制面板中打开应用的高级选项并进行设置。

那么有没有一种方法可以检查应用程序是否具有权限以通知用户?

这是我的意思:设置> 应用> (单击应用)>单击“ 高级选项”。另外请记住,某些应用可能不需要任何权限,因此您可能看不到任何权限。检出MS weather app,它需要两个权限。

screenshot

1 个答案:

答案 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