我正在使用permission插件来检查权限状态并请求它们是否处于deny
状态。但是,从第一次开始,电话和存储的权限状态都是notAgain
。因此,我无法请求用户授予phone
和storage
的权限。我也在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
首次启动应用程序的原因
答案 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>
}