Android检查权限

Mad*_*bar 2 android android-permissions android-6.0-marshmallow

我正在SDK版本23中开发我的项目,其中新引入了应用程序权限.在某些指导原则中,他们使用以下代码来读取电话状态权限是否被授予

if (ContextCompat.checkSelfPermission(serviceContext, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
    //Read Phone state
   }else{
}
Run Code Online (Sandbox Code Playgroud)

但我直接访问checkSelfPermission如下

if(serviceContext.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
      //Read Phone state
   }else{
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.我的问题是上面这些代码之间的区别是什么?.这是检查是否授予许可的正确方法?

MH.*_*MH. 8

我的问题是上面这些代码之间有什么区别?

无,在API 23(+)设备上.

但是,运行旧版Android的设备会在您尝试context.checkSelfPermission()直接调用时生成错误.这种方法直到API 23才可用.

ContextCompat提供了一种向后兼容的方式来运行checkSelfPermission()旧的API.如果您查看实现,您将看到它通过简单地checkPermission()使用应用程序自己的流程参数委派调用来实现此目的.checkPermission()自第一个API发布以来就已经可用,因此可以全面使用.

public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
    if (permission == null) {
        throw new IllegalArgumentException("permission is null");
    }

    return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
}
Run Code Online (Sandbox Code Playgroud)

检查是否授予许可的正确方法是什么?

所以,回答这个问题:如果你支持运行Android'Marshmallow'6.0及更新版本的设备,那么你可以使用任何一种方法.但是,由于您更有可能想要支持某些旧版Android,请使用ContextCompat.