或许之前我们还可以利用修改targetSdkVersion值来兼容运行时的权限授权问题,但是随着Android新版本的发布,minSdkVersion也会随着提高,这个时候我们想在项目上支持运行时的权限授权问题就迫在眉睫了,特别是旧项目,难度有点大,改动不小。
git代码:github.com/linqssonny/…
废话不说,我们先来看看如何使用:
List<String> permissionList = new ArrayList<>();
permissionList.add(Manifest.permission.CAMERA);
PermissionUtils.getInstances().requestPermission(this, permissionList, new IRequestPermissionCallBack() {
@Override
public void onGranted() {
Toast.makeText(MainActivity.this, "请求成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied() {
Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
}
});
是不是很简单啊,只需几句代码就搞定了,没错,就是这么任性,哈哈….
具体的权限申请方法我就不阐述了,百度谷歌出来一大丢,下面是requestPermssion方法:
/**
* start request permission
*
* @param activity
* @param permissions
* @param iRequestPermissionCallBack
*/
public void requestPermission(Activity activity, List<String> permissions, IRequestPermissionCallBack iRequestPermissionCallBack) {
// if the os version < 23
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
executeIRequestPermissionCallBackForOnGranted(iRequestPermissionCallBack);
return;
}
if (null == activity) {
throw new NullPointerException("the activity is empty");
}
if (null == permissions || permissions.size() <= 0) {
throw new NullPointerException("the permissions list is empty");
}
//filter have permissions
ArrayList<String> permissionsList = new ArrayList<>();
for (int i = 0; i < permissions.size(); i++) {
String permission = permissions.get(i);
if (!checkSelfPermission(activity, permission)) {
permissionsList.add(permission);
}
}
//have permission
if (permissionsList.size() <= 0) {
executeIRequestPermissionCallBackForOnGranted(iRequestPermissionCallBack);
return;
}
//判断permission是否曾经拒绝过
for (int i = 0; i < permissionsList.size(); i++) {
String permission = permissionsList.get(i);
if (shouldShowRequestPermissionRationale(activity, permission)) {
if (!executeIRequestPermissionCallBackForOnRationale(iRequestPermissionCallBack)) {
showPermissionAskDialog(activity, buildMessageByPermission(activity, permission));
}
return;
}
}
mActivity = activity;
mIRequestPermissionCallBack = iRequestPermissionCallBack;
PermissionActivity.startRequestPermission(mActivity, permissionsList);
}
请求权限分为4步:
1、判断当前系统是否大于等于23,如果不是的话,直接回调授权成功,兼容旧版本,如果是的话按下面步骤。
2、可能我们申请的权限不止一个,先过滤掉已经持有的权限。如果全部持有权限,则回调授权成功,如果没有继续执行,此时第3步剩下的是没有授权的权限。
3、判断是否用户是否曾经拒绝过,如果曾拒绝过,会执行IRequestPermissionCallBack回调中的onRationale方法,该方法返回boolean值,如果开发者自行想弹框告知用户的话,重写该方法并把返回值改为true,我们将不会任务处理,反之我们会弹框告知用户。如果未曾拒绝过,则进行第4步。
4、这一步将真正向系统申请权限,这里我采用了跟glide的思路,构建了一个Activity(原本想采用Fragment,但由于Fragment中的requestPermissions需要api26以上,或者采用v4包的Fragment,考虑到兼容性,就直接采用activity了),并在其中请求权限,请求成功与否都会回调IRequestPermissionCallBack中的方法。
这里顺便贴一下运行权限(9组24个),方便大家查阅(只要你申请一组中的某一个权限,授权成功后你将拥有该组的所有权限): 一、存储(android.permission-group.STORAGE)
permission:android.permission.READ_EXTERNAL_STORAGE 读取外部存储器
permission:android.permission.WRITE_EXTERNAL_STORAGE 写外部存储器
二、日历(android.permission-group.CALENDAR)
permission:android.permission.READ_CALENDAR 读取日历
permission:android.permission.WRITE_CALENDAR 写入日历
三、通讯录(android.permission-group.CONTACTS)
permission:android.permission.WRITE_CONTACTS 写入通讯录
permission:android.permission.READ_CONTACTS 读取通讯录
permission:android.permission.GET_ACCOUNTS 访问通讯录权限
四、电话(android.permission-group.PHONE)
permission:android.permission.CALL_PHONE 打电话
permission:android.permission.READ_PHONE_STATE 读取手机状态
permission:android.permission.READ_CALL_LOG 看电话记录
permission:android.permission.WRITE_CALL_LOG 编写调用日志
permission:android.permission.USE_SIP 使用SIP(不知道是干嘛的)
permission:android.permission.PROCESS_OUTGOING_CALLS 过程输出调用(不知道是干嘛的)
permission:com.android.voicemail.permission.ADD_VOICEMAIL 添加语音信箱
五、相机(android.permission-group.CAMERA)
permission:android.permission.CAMERA
六、传感器(android.permission-group.SENSORS)
permission:android.permission.BODY_SENSORS
七、位置(android.permission-group.LOCATION)
permission:android.permission.ACCESS_FINE_LOCATION 获取好位置
permission:android.permission.ACCESS_COARSE_LOCATION
八、麦克风(android.permission-group.MICROPHONE)
permission:android.permission.RECORD_AUDIO 录音
九、短信(android.permission-group.SMS 信息)
permission:android.permission.READ_SMS 读取信息
permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送
permission:android.permission.RECEIVE_MMS 接收彩信
permission:android.permission.RECEIVE_SMS 收信息
permission:android.permission.SEND_SMS 发信息
permission:android.permission.BROADCAST_SMS(不知道是干嘛的)