ContextCompat.checkSelfPermission的用例是什么?

Neo*_*eoh 5 android android-permissions android-support-library android-6.0-marshmallow

目前我有以下方法来检查AppCompatActivityMarshmallow的运行时权限:

if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
    boolean hasPermission = checkSelfPermission(Manifest.permission.XX)
                == PackageManager.PERMISSION_GRANTED;
    if(!hasPermission) {
        if(shouldShowRequestPermissionRationale(Manifest.permission.XX)) {
            // explain reason for permission, try again

        } else {
            // user deny with "don't show again"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现它对棉花糖的效果相当好.但是,我应该担心前M版本中的权限,我应该使用ContextCompat.checkSelfPermission()吗?我知道使用Xposed或类似的框架可以修改pre-M中的权限,这是否意味着ContextCompat.checkSelfPermission()能够充分检测由于Xposed等而导致的权限拒绝?

Flo*_*ern 2

根据权限拦截器的实现(例如通过 Xposed),应用程序可能会被提供虚假数据,或者应用程序的进程将被撤销权限。

您将无法检测应用程序是否获取虚假数据,但在这种情况下您的应用程序至少不会崩溃。

如果在进程级别撤销权限,则ContextCompat.checkSelfPermission()即使在 pre-M 上也能够检测到它并返回PERMISSION_DENIED。请注意,如果您使用该ContextCompat方法,您还必须使用ActivityCompat.shouldShowRequestPermissionRationale()ActivityCompat.requestPermissions()方法或其FragmentCompat版本。

有关更多详细信息,请参阅此处:用于处理权限的支持库方法