我有点困惑,checkSelfPermission()
和shouldShowRequestPermissionRationale()
之间有什么区别
如果我理解正确,他们都会检查应用程序是否需要向用户询问权限,所以为什么我必须检查两次?为什么不能这么简单?
if (ShouldAskForPermission(WRITE_FILE) == true)
ShowMessage("The application need permission for writing a file on your device, do you allow it?", YES_NO_BUTTONS);
答案 0 :(得分:0)
因为他们做不同的事情。 checkSelfPermission
检查您是否拥有许可,shouldShowRequestPermissionRationale
检查您是否应该说明您需要许可的理由。
流程应该是:
之所以将它们彼此分开,我认为主要是为了向后兼容。 shouldShowRequestPermissionRationale
的引入比 checkSelfPermission
晚得多,因此他们不想更改 checkSelfPermission
的契约,因为这会导致大量损坏的代码。例如,如果他们将 checkSelfPermission
的返回值拆分为 PERMISSION_DENIED_AND_NEED_TO_SHOW_RATIONALE
和 PERMISSION_DENIED_AND_DO_NOT_NEED_TO_SHOW_RATIONALE
,它会破坏带有 if (returnValue == PackageManager.PERMISSION_DENIED)
类型分支的任何代码。
答案 1 :(得分:-1)
在M Preview 1之后,如果是第一次显示该对话框,则没有“不再询问”复选框。
如果用户拒绝许可请求,则第二次请求许可时,许可对话框中将出现一个不再询问复选框。
所以逻辑应该是这样的:
请求权限:
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
} else {
//Do the stuff that requires permission...
}
检查权限是否在onRequestPermissionsResult中被拒绝或授予。如果以前拒绝了该权限,则这次在权限对话框中将有一个“不再询问”复选框。
致电shouldShowRequestPermissionRationale以查看用户是否选中了“从不询问”。仅当用户选择了“不再询问”或设备策略时,shouldShowRequestPermissionRationale方法才返回false。 禁止该应用获得该权限:
if (grantResults.length > 0){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Do the stuff that requires permission...
}else if (grantResults[0] == PackageManager.PERMISSION_DENIED){
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//Show permission explanation dialog...
}else{
//Never ask again selected, or device policy prohibits the app from having that permission.
//So, disable that feature, or fall back to another situation...
}
}
}
因此,您不必跟踪用户是否选中了“不再询问”。