拒绝后权限请求颤动应用程序

Posted

技术标签:

【中文标题】拒绝后权限请求颤动应用程序【英文标题】: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次)拒绝相同的权限时会出现问题,因为不再显示权限请求弹出窗口,在这种情况下需要手动打开应用程序设置并手动修改权限。我必须确保:前两次我通过弹出窗口请求权限,然后我应该打开设置屏幕

【问题讨论】:

【参考方案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 我更新了我的答案

以上是关于拒绝后权限请求颤动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

用户拒绝位置服务后再次请求权限?

与 Firebase DatabaseError 一起颤动:权限被拒绝 [重复]

权限处理程序颤动多个权限错误

即使授予存储权限后,在三星手机上创建目录也被拒绝

无法在运行发布颤动时发布 https 请求

Facebook Unity SDK 6.0 重新请求拒绝权限