EasyPermission分析详解
既然要介绍Android权限封装库,不能不提前介绍下Android的权限管理内容。
1.权限相关首先和build target version相关,如果默认的target-ersion>=23,则程序中需要申请的权限则默认全部动态申请,即运行时申请;如果build target version<23,那么权限主要和用户手机的版本相关,如果用户手机版本低于6.0,则默认通过AndroidManifest文件赋予所有权限,如果>=6.0,则默认进行动态权限申请。
下面分析EasyPermissions源码,通过注释解释:
package test.jinesh.easypermissionslib;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import java.lang.reflect.Method;
/**
* Utility class for asking permission
* 作者信息介绍
* @author Jinesh Francis
*/
public class EasyPermission {
/**所有权限申请都统一使用的 请求码,这个数值可以随意设定
* Request code for all permissions
*/
private static final int MY_PERMISSIONS_REQUEST = 100;
/**
* 这里需要保存 申请权限的activity, 用于后面反射回调 权限申请后的回调
* 说白了 就是申请权限后 成功怎么办 失败怎么办 的方法调用
* Activity reference for reflection
*/
private Activity runningActivity;
/**
* method to request permission
* 申请权限调用这个方法 参数:activity 和申请的权限
* @param runningActivity current activity reference
* @param permission permission to ask
*/
public void requestPermission(Activity runningActivity, String permission) {
this.runningActivity = runningActivity;
//判断是有权限 如果有 返回PERMISSION_GRANTED
if (ContextCompat.checkSelfPermission(runningActivity,
permission)
!= PackageManager.PERMISSION_GRANTED) {
//没有权限去申请权限
ActivityCompat.requestPermissions(runningActivity,
new String[]{permission},
MY_PERMISSIONS_REQUEST);
} else {
//有权限 去执行相应函数
callInterface(runningActivity, permission, true);
}
}
/**
* This method is called in onRequestPermissionsResult of the runningActivity
* 这个方法在 申请权限的activity中onRequestPermissionsResult方法进行回调
* @param requestCode The request code of runningActivity.
* @param permissions The requested permissions of runningActivity.
* @param grantResults The grant results for the corresponding permissions from runningActivity
*/
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
//判断请求码 根据不同的请求码 决定不同的操作 这个对应上面请求的码
case MY_PERMISSIONS_REQUEST: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//如果被赋予权限 则执行相应的方法 就是获取了权限 可以继续 之前的进程
if (runningActivity != null) {
callInterface(runningActivity, permissions[0], true);
}
} else {
if (runningActivity != null) {
//如果没有被赋予权限 则调用相应的方法去处理
callInterface(runningActivity, permissions[0], false);
}
}
}
}
}
/**
* Method to call OnPermissionResult interface
* 申请权限后的事务处理,boolean 值 决定是否被赋予权限
* @param activity activity reference
* @param permission current asked permission
* @param isGranted true if permission granted false otherwise
* @throws InterfaceNotImplementedException throws when OnPermissionResult is not implemented
*/
private void callInterface(Activity activity, String permission, boolean isGranted) throws InterfaceNotImplementedException {
Method method;
try {
//通过反射获取 activity的方法
method = activity.getClass().getMethod("onPermissionResult", String.class, boolean.class);
} catch (NoSuchMethodException e) {
//如果activity没有实现相关接口 则抛出异常 提示去实现接口
throw new InterfaceNotImplementedException("please implement EasyPermission.OnPermissionResult interface in your activity to get the permissions result");
}
if (method != null) {
try {
//找到方法 进行调用
method.invoke(activity, permission, isGranted);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Interface to notify permission result
*/
public interface OnPermissionResult {
/**
* Method will get called after permission request
* 回调接口 activity需要 继承实现 下面的方法 好在 权限申请后进行回调
* @param permission asked permission
* @param isGranted true if permission granted false otherwise
*/
void onPermissionResult(String permission, boolean isGranted);
}
/**
* Exception throws when OnPermissionResult interface not implemented
*/
//错误声明
private class InterfaceNotImplementedException extends RuntimeException {
private InterfaceNotImplementedException(String message) {
super(message);
}
}
}
上面就是基本的代码 但是可以看出来其中还是有比较多的不足,比如在申请权限的时候没有判断系统是否还会给你 进行权限申请提示,因为如果用户拒绝了比较多次,这个弹窗下次是不会触发的,会产生问题。
其次没有进行 多次拒绝后 ,对用胡进行引导的提示,指引用户去 设置界面设置 权限。
另外附上 我总结的 权限流程图吧: 喜欢的别忘了点赞!:)