官方给的样例Demo:
* A sample permissions request looks like this:
* <code>
* private void showContacts() {
* if (
checkSelfPermission
(Manifest.permission.READ_CONTACTS)
* != PackageManager.PERMISSION_GRANTED) {
*
requestPermissions
(new String[]{Manifest.permission.READ_CONTACTS};
* PERMISSIONS_REQUEST_READ_CONTACTS);
* } else {
* doShowContacts();
* }
* }
*
* {@literal @}Override
* public void
onRequestPermissionsResult
(int requestCode, String[] permissions,
* int[] grantResults) {
* if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS
* && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
* showContacts();
* }
* }
* </code>
了解一下什么是运行时权限:
检查是否具有指定权限:
checkCallingPermission(String)
ContextWrapper.java (android-6.0\frameworks\base\core\java\android\content)
@Override
public int checkSelfPermission(String permission) {
return mBase.checkSelfPermission(permission);
}
mBase:Context,通常指上下文环境。
Context.java (android-6.0\frameworks\base\core\java\android\content)
@PackageManager.PermissionResult
public abstract int checkSelfPermission(@NonNull String permission);
该方法为抽象方法,具体实现在Context的子类ContextImpl中。
ContextImpl.java (android-6.0\frameworks\base\core\java\android\app)
@Override
public int checkSelfPermission(String permission) {
if (permission == null) {
1、非空判断,抛IllegalArgumentException异常
throw new IllegalArgumentException("permission is null");
}
return checkPermission(permission, Process.myPid(), Process.myUid());
2、
}
就拿上面的样例Demo来讲, 此时申请的权限为READ_CONTACTS,也就是说permission = Manifest.permission.READ_CONTACTS。2处调用checkPermission方法,不仅要传参permission,还要传入当前进程的
pid、uid值。通俗地讲pid可以用作killProcess、sendSignal,而uid一般是用作数据共享。
@Override
public int checkPermission(String permission, int pid, int uid) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
}
try {
return ActivityManagerNative.getDefault().checkPermission(
permission, pid, uid);
1、
} catch (RemoteException e) {