我是否应该更喜欢使用ContextCompat或PermissionChecker进行Android权限检查?

Ada*_*m S 7 android android-support-library

我可以选择以下任一方式检查我的应用是否具有给定的权限.

哪一个更受欢迎?

ContextCompat(来自support-compatlib):

ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
Run Code Online (Sandbox Code Playgroud)

或者PermissionChecker(来自support-core-utilslib):

PermissionChecker.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
Run Code Online (Sandbox Code Playgroud)

请注意(截至25.3.1)-core-utils取决于-compat:

| | +--- com.android.support:support-core-utils:25.3.1 | | | +--- com.android.support:support-annotations:25.3.1 | | | \--- com.android.support:support-compat:25.3.1 (*)

Ada*_*m S 12

走进源PermissionChecker,我们可以看到,它首先调用通过对Context#checkPermission与捞出早期如果调用代码并没有权限.如果调用代码确实有权限,那么它会转到神秘的AppOpsManager询问我们是否有permissionToOp,然后检查是否返回noteProxyOp.这给了我们一个关于这个方法的用途的提示,因为noteProxyOp开始的文档:

记下在处理IPC时代表另一个应用程序执行操作的应用程序.

另外,如果我们检查方法的返回值,PermissionChecker我们会看到我们得到3个可能的结果之一:

许可检查结果是PERMISSION_GRANTED或者PERMISSION_DENIED或者PERMISSION_DENIED_APP_OP.

也就是说,0,-1或-2返回值.此类似乎适用于接收进程间通信并代表其他应用程序执行操作的应用程序.

ContextCompat另一方面,只需抓取当前进程ID并直接返回结果Context#checkPermission:

PERMISSION_GRANTED如果给定的pid/uid允许该权限,或者PERMISSION_DENIED不允许.

因此,对于大多数开发人员编写标准的Android应用程序,使用ContextCompat.