Flutter权限状态即使在首次启动时也不会再次获得

时间:2019-02-24 12:16:59

标签: android flutter android-permissions flutter-plugin

我正在使用permission插件来检查权限状态并请求它们是否处于deny状态。但是,从第一次开始,电话和存储的权限状态都是notAgain。因此,我无法请求用户授予phonestorage的权限。我也在Android清单文件中指定了它们。

这是检查和请求权限的代码段

List<Permissions> permissions = await Permission.getPermissionStatus([PermissionName.Location, PermissionName.Phone, PermissionName.Storage]);
    permissions.forEach((permission) {
      if(permission.permissionStatus.toString().contains('deny') ){
        neededPermissions.add(permission.permissionName);
      }
    });
if(neededPermissions.length > 0){
      requestPermissions(neededPermissions);
    }

我不知道为什么他们是notAgain首次启动应用程序的原因

2 个答案:

答案 0 :(得分:0)

我遇到了一个同样的问题,即getPermissionsStatus([PermissionName.Storage])总是在实际拒绝任何权限之前总是返回PermissionStatus.notAgain

我发现,仅当按下拒绝按钮时,权限状态才会为“拒绝”,因此在这种情况下,它永远不会再出现(也许有解决方法,或者我们无法正确理解软件包-也许我们需要以使用未定状态。

在Android中选择权限的正确流程如下:

1-检查功能是否具有权限

a-如果授予了权限-执行功能    相关功能

b-如果未授予许可,则请求它。

请求权限:

1-为用户提供一些有关为什么需要许可的背景信息,可以是对话框,祝酒词或其他任何UI的形式,说明应用为何要求该许可

2-如果允许,那么您可以高兴地跳跃并使用所需的功能并继续生活。

3-如果权限被拒绝(这很棘手)

a-如果未设置“不再询问”标志,那么您应该不断触发教育对话和许可请求。

b-如果设置了“不再询问”标志,则应指示用户他请求的功能仍需要此权限,并且他现在必须转到“设置”页面并从那里授予权限。将FlushBar与指向“设置”页面的按钮一起使用将是一种合适的方法。

这是我使用权限包设法完成上述操作的方式。

请告诉我您是否有更好的方法。

      bool deniedBefore = false; //store this value in SharedPreferences
//flag to check if the permission flow was denied before
        if(Platform.isAndroid)
        {
        if(deniedBefore)
        {
        Permission.getPermissionsStatus([PermissionName.Storage]).then((result){Permissions permission = result.removeAt(0);
        if(permission.permissionStatus==PermissionStatus.notAgain)
        {
        //showFlushbar();
        print("Direct users to Settings page")
        }

        if(permission.permissionStatus==PermissionStatus.deny)
        {
    print("Show educational dialog");
        //showEducationalDialog();
        }
        if(permission.permissionStatus==PermissionStatus.allow)
        {
        //use feature
        print("Permission was granted")
        }
        }
        }
        else
        {
        Permission.getPermissionsStatus([PermissionName.Storage]).then((result)
        {
        Permissions permission = result.removeAt(0);
        print(permission.permissionStatus);
        if(permission.permissionStatus!=PermissionStatus.allow)
        {
        //showDialog()
        setState(() { //the user has seen the permission request before - 
                      // if denied the status will be deny 
                     //if norAgain then it is a true notAgain is true
        deniedBefore = true;
        });
        }
        if(permission.permissionStatus==PermissionStatus.allow)
        {
        //useFeature
        }
        }
        }
        }

我上面试图实现的是在检查notAgain标志原因之前让权限流至少运行一次,然后我才知道这是一个真正的notAgain而不是bug。

答案 1 :(得分:0)

也许您的调用请求权限两次,在initState()内针对启动请求的调用请求权限。

<link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css" rel="stylesheet"/>
<div class="level is-mobile name_logo">
    <div class="level-left">
        <div class="level-item has-text-centered">
          <div>
            <p class="heading">Example 1</p>
            <p class="is-size-5 has-text-weight-bold title">Example 2</p>
          </div>
        </div>
    </div>
</div>

}