【问题标题】:How to check if user has granted app the permission for pictures folder?如何检查用户是否已授予应用程序对图片文件夹的权限?
【发布时间】:2019-03-09 06:02:53
【问题描述】:

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

那么有没有办法检查应用是否有权限以通知用户?

这就是我的意思:设置 > 应用程序 > (点击应用程序) > 点击“高级选项”。另请注意,某些应用可能需要任何权限,因此您可能看不到它们的任何权限。查看 MS 天气应用,它需要两个权限。

【问题讨论】:

  • 可以分享更多关于应用程序高级选项的细节吗?
  • @NicoZhu-MSFT 设置 > 应用程序 >(应用程序)> 高级选项。
  • 我已经检查了如下截图的设置页面,但我无法获得高级选项。你能指出来吗?
  • @NicoZhu-MSFT 见编辑。您的屏幕截图是在单击应用程序之前。另请注意,某些应用可能需要任何权限,因此您可能看不到它们的任何权限。查看 MS 天气应用,它需要两个权限。
  • 嗨@ispiro,你有没有机会使用try catch 块访问图片文件夹,然后从Exception 确定用户是否有权限?

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


【解决方案1】:

这是迄今为止我找到的最佳解决方案:

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(请参阅 docs)启动 设置,这会打开带有权限切换的应用高级设置页面。

现在这是一个不幸的问题 - 我发现更改权限将在当前时刻强制关闭应用程序。我在第一个对话框中告知用户这个事实。万一将来发生这种变化,代码已经为此替代方案准备好了 - 将显示一个新对话框,用户可以在权限更改时确认它,并且该方法将递归调用自身并再次尝试访问库。

当然,我建议在应用因权限更改而关闭之前保存用户的数据,这样在重新打开时,数据将保持不变,用户的流程不会中断。

如果您确实依赖此权限来实现其功能,也可以在应用启动后立即调用此权限。这样你就知道你要么有访问权限,要么用户会在开始时就给它,所以应用程序将被终止这一事实并没有什么坏处。

更新:我发现这个问题很有趣,所以我有written a blogpost about it

【讨论】:

  • 谢谢你,马丁。这是一个很好的答案。我只是想分享我们应该使用 ContentDialog 而不是 MessageDialog。请参阅此处 MessageDialog 文档中的重要说明部分:docs.microsoft.com/en-us/uwp/api/… 我还想分享一下,如果清单声明了功能,则 KnownFolders API 在关闭权限时不会抛出异常。 KnownFolder API 不会引发异常,而是会在已知文件夹中创建应用特定的子文件夹。
  • @David Hollowell - 不幸的是,当用户在设置中明确禁止权限时,API 会抛出异常,我自己测试过,可能是一个错误?
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2021-09-18
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多