我处理Android中的点播权限,我发现了一个令人困惑的情况。我的目标是显示一个带有"转到应用设置的对话框"如果用户已选择"再也不询问"在许可中。
好的,如果用户选择"再也不要问"然后,下次您请求权限时,您可以在方法onRequestPermissionsResult
public boolean checkIfShouldShowGoToSettingsDialog(String permissions[], int[] grantResults){
for (int i=0; i<permissions.length; i++){
if (grantResults[i] == PackageManager.PERMISSION_DENIED && !ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permissions[i])) {
return true;
}
}
return false;
}
问题在于,如果您这样做,每次拨打requestPermission()
时,即使先前已取消权限,即使选中了复选框,也会再次调用onRequestPermissionsResult
。因此,checkIfShouldShowGoToSettingsDialog
返回true
,因为权限为DENIED
且shouldShowRequestPermissionRationale正在返回false
。我不想要那个。我想显示&#34;转到应用设置&#34;对话框仅在用户第一次选择&#34;不要再问及#34;。
所以我尝试了一些东西:
我在调用requestPermission()
之前添加了此验证。我尝试删除对方法shouldShowRequestPermissionRationale()
返回false的权限,因为它认为这些权限已选中复选框:
public String[] removePermanentlyDeniedPermissionsFromArray(String[] permissions){
List<String> result = new ArrayList<>();
for (String permission : permissions) {
if (ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permission)) {
result.add(permission);
}
}
return result.toArray(new String[result.size()]);
}
它工作得很好但是......问题是你第一次打开应用程序时,第一次要请求权限... shouldShowRequestPermissionRationale()为所有人返回FALSE !!所以没有请求任何权限。
然后,如果用户已经检查过&#34;再也没有问过&#34;我怎么能避免callrequestPermission() ?
答案 0 :(得分:0)
我很乐意回答你的问题。在我过去的项目中,我也遇到过类似的问题。以下是我的解决方案。 (1)为了避免重复提示,我们必须在用户首次同意时保存成功的令牌。等到下一个操作,首先确定用户是否已同意,如果您已同意,则不再提示。否则,再次提示用户。 (2)这里我们需要使用开源框架来快速保存提醒标签。为什么使用这个框架?因为它有一个方法可以直接设置标签的有效期。具体用法可在此处查看:https://github.com/yangfuhai/ASimpleCache
答案 1 :(得分:0)
所以这是对shouldShowPermissionRationale
的错误使用。如果早先拒绝了许可(没有点击复选框),那就是这样。这是第一次总是假的。检查文档
/**
* Gets whether you should show UI with rationale for requesting a permission.
* You should do this only if you do not have the permission and the context in
* which the permission is requested does not clearly communicate to the user
* what would be the benefit from granting this permission.
* <p>
* For example, if you write a camera app, requesting the camera permission
* would be expected by the user and no rationale for why it is requested is
* needed. If however, the app needs location for tagging photos then a non-tech
* savvy user may wonder how location is related to taking photos. In this case
* you may choose to show UI with rationale of requesting this permission.
* </p>
*
* @param activity The target activity.
* @param permission A permission your app wants to request.
* @return Whether you can show permission rationale UI.
*
* @see #checkSelfPermission(android.content.Context, String)
* @see #requestPermissions(android.app.Activity, String[], int)
*/
请求运行时权限的过程
1.生成未授予的权限列表。
List<String> permissionList = new ArrayList<>()
if(somePermission == PackageManager.PERMISSION_DENIED){
permissionList.add(somePermission);
}
//so on
String[] permissionArray = permissionList.toArray(new String[permissionArray.size()]);
2.如果同时询问多个权限,理由可能会变得复杂,完全忽略它。
3.使用上面生成的Array请求权限。
4.如果权限被拒绝,如果用户必须具有权限才能将用户重定向到设置屏幕。
最佳实践:
始终将应用程序中必需和可选的权限分组,并忽略对可选权限的拒绝。