Android6.0权限解析及轻量级封装

或许之前我们还可以利用修改targetSdkVersion值来兼容运行时的权限授权问题,但是随着Android新版本的发布,minSdkVersion也会随着提高,这个时候我们想在项目上支持运行时的权限授权问题就迫在眉睫了,特别是旧项目,难度有点大,改动不小。
git代码:https://github.com/linqssonny/PermissionUtils
废话不说,我们先来看看如何使用:

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(不知道是干嘛的)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值