【问题标题】:Permission request flutter app after denial拒绝后权限请求颤动应用程序
【发布时间】:2022-01-02 01:20:48
【问题描述】:

我正在开发一个flutter应用,我需要管理权限请求,但是我不知道如何处理一个特定的事件:

如果我通过弹出窗口两次拒绝相同的权限,以后可能无法批准它,因为弹出窗口不会再次出现。

Future<void> requestStoragePermission() async{
  var status = await Permission.storage.status;
  if(status.isPermanentlyDenied){
    await AppSettings.openAppSettings();
  } else {
    await Permission.storage.request();
  }
}

我不明白如何区分权限尚未授予或多次拒绝,因为函数:Permission.storage.status 总是返回“拒绝”。

******编辑******

当用户多次(2次)拒绝相同的权限时会出现问题,因为不再显示权限请求弹出窗口,在这种情况下需要手动打开应用程序设置并手动修改权限。我必须确保:前两次我通过弹出窗口请求权限,然后我应该打开设置屏幕

【问题讨论】:

    标签: android flutter android-permissions


    【解决方案1】:

    我一直使用grantedlimited 两种状态来管理我的权限(仅用于iOS14+)。这两个权限是唯一真实的状态。其他都是虚假状态。

    permission_handler 包已经为您处理了很多逻辑。在它发出请求之前,它会检查状态以查看它是否已经定义。如果是,那么它将返回状态。如果该权限从未被请求过,那么它将请求该权限。

    就个人而言,我为权限请求设置了一个通用方法,以保持干燥。

    Future<bool> requestPermission(Permission setting) async {
      // setting.request() will return the status ALWAYS
      // if setting is already requested, it will return the status
      final _result = await setting.request();
      switch (_result) {
        case PermissionStatus.granted:
        case PermissionStatus.limited:
          return true;
        case PermissionStatus.denied:
        case PermissionStatus.restricted:
        case PermissionStatus.permanentlyDenied:
          return false;
      }
    }
    

    然后我提出一个类似的请求

    final canUseStorage = await requestPermission(Permission.storage);
    
    if (canUseStorage) {
      // do something with storage
    }
    

    如果您的 UI 依赖于来自 Permission 的状态,那么您仍然调用 Permission.storage.status

    [编辑]
    目前,您无法跟踪通过permission_handler 显示请求弹出窗口的次数。它只返回状态。您需要根据返回的状态值将用户带到设置。

    旁注
    而不是直接将用户带到设置中。也许你显示一个弹出窗口说“看起来我们没有权限......”,用户可以点击一个按钮进入设置,为用户提供一些上下文,说明他们为什么需要去他们的设置。这也是更好的用户体验!

    【讨论】:

    • 请看我的问题,我编辑了它
    • @Mattia 我更新了我的答案
    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2017-09-06
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多