ContextCompat.checkSelfPermission 的用例是什么?

What is the use case for ContextCompat.checkSelfPermission?

目前我有以下方法在 AppCompatActivity 中检查 Marshmallow 的运行时权限:

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"
        }
    }
}

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

根据权限阻止程序的实施(例如,通过 Xposed),应用程序会被提供虚假数据,或者应用程序的进程将被撤销权限。

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

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

查看此处了解更多详情:Support library methods for handling permissions