Android targetSDK不小于26,动态申请权限的两种方式详解

 

前文:说到现在的手机系统,版本高,事却多了,自从6.0以后动态申请权限开始,安全性也多了。自从五月份VIVO,小米,百度等平台要求targetSdk 不小于26后,动态申请权限便要开发者自己写了,之前为了偷懒,不去动态申请,现在应用宝也要求版本了,没办法,只能花时间把几个项目都加上动态权限的申请,踩踩坑。

相信刚开始很多开发者对动态申请都深恶痛绝,简直是给自己加需求,不过仔细想想,这种安全也是对的,就像自己的家里也要加好几道锁一样,不能放任何流氓软件在自己不知情的情况下,获取到信息吧,就像老婆在家,也要让她锁好门,防止老王,出个远门,也要把财产锁好一样,房间里的小房间也有锁,毕竟有时候有别人在还想办事,得把门锁起来才行(变态,求刺激的除外),所以,不要担心,下面本wolf为大家讲一下两种方式和封装,各位好好的处理对待自己的项目就好,如有不对之处,请及时指出,有则改之,无则加勉,本wolf先在此谢过了。

 

一、原生封装

原生的申请动态权限方法,先看看如何动态申请一个权限,项目中有打电话需求,在打电话的点击事件,先动态判断下权限跟申请。

 if (ActivityCompat.checkSelfPermission(this,
 Manifest.permission.READ_PHONE_STATE) != PackageManager. PERMISSION_GRANTED) {//判断权限是否申请

//申请权限

 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},REQUEST_READ_PHONE_STATE){
                return;
            }

点进requestPermission()方法源码可以看到,回调了CallBack

Android targetSDK不小于26,动态申请权限的两种方式详解_第1张图片

故此处也有回调方法

Android targetSDK不小于26,动态申请权限的两种方式详解_第2张图片

此时,简单的动态申请一个权限完成了。

此时,可能有的需求会一次申请多个权限,如果分开写,便会代码太臃肿,下面讲解如何一次申请一个权限组。

1、写出需要申请的权限组

 

 

2、

将权限组遍历检查权限

Android targetSDK不小于26,动态申请权限的两种方式详解_第3张图片

3、回调中对权限进行处理,与单个权限的回调相同

Android targetSDK不小于26,动态申请权限的两种方式详解_第4张图片

boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, permissions[i]);//遍历检查权限

走到这一步,对权限跟权限组的动态申请已经实现了,但是代码用的地方很多,此处,做一个简单封装,供大家参考,各位大佬也可以根据自己的习惯做封装。

Android targetSDK不小于26,动态申请权限的两种方式详解_第5张图片

工具类中传入三个状态值即可,回调则写在BaseActivity ,BaseFragment中,自己根据定义的code,进行switch,case的判断来提示不同的提示语,或者处理不同的业务逻辑即可。

二、使用三方进行动态申请权限

三方申请中,使用的便是Rx系列,此处为RxPermission,EasyPermission此处不描述了大同小异

三方申请,首先要导入依赖

implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

导入后同步,至于lamda 表达式,看各位喜好是否导入。

使用如下,申请单个权限时:

RxPermissions rxPermissions = new RxPermissions(activity);

    rxPermissions.requestEach(Manifest.permission.CAMERA)                                                                                                   
     .subscribe(permission1 -> {
    if(permission1.granted){//已申请
        
        return;
    }
    if(permission1.shouldShowRequestPermissionRationale){//弹框
        
        return;
    }
    ToastUtil.showShortToast("没有权限,请到应用管理-权限中检查权限");

});

 

申请权限组:

 

RxPermissions rxPermissions = new RxPermissions(activity);

rxPermissions.requestEach(Manifest.permission.CAMERA,
 Manifest.permission.CALL_PHONE)                                                                                                    
        .subscribe(permission1 -> {
    if(permission1.granted){//已申请

        return;
    }
    if(permission1.shouldShowRequestPermissionRationale){//弹框

        return;
    }
    ToastUtil.showShortToast("没有权限,请到应用管理-权限中检查权限");

});

 

用了三方是不是很简单啊,代码也简洁了不少,三方封装工具类如下:

public static boolean isHave = false;
public static boolean checkPermission(Activity context,String permission){
    rxPermissions = new RxPermissions(context);
    rxPermissions.requestEach(permission)
            .subscribe(permission1 -> {
                if(permission1.granted){
                    isHave = true;
                    return;
                }
                if(permission1.shouldShowRequestPermissionRationale){

                    return;
                }
            ToastUtil.showShortToast("没有权限,请到应用管理-权限中检查权限");
            });
    return isHave;
}

 

原生封装跟三方封装的区别,三方的代码简洁,不需要自己回调处理,不过三方的东西毕竟是三方,不是自己维护的,此处喜欢用什么来实现就看个人喜好喽,对于一个APP,动态权限只是使用前给的第一步,就像家里的锁一样,打开了,才能进去享受美食,美酒,美人,第一步的锁一定要谨慎,项目应用中记得仔细检查,别遗漏了忘记动态申请的权限导致项目崩溃就很尴尬了。

PS:动态权限中遇到了很多坑,动态修改后7.0以上相机的provider处理,安装权限的处理,在用户手动应用管理中点击禁止,便不会弹框,此处也要有toast提醒(就怕有脑子瓦特了的用户会这样玩),这些都是本wolf第一次修改时候遇到的坑,希望各位大佬开发时候多加注意,此处建议封装使用,有利于代码维护,最后,如果本篇有错误之处请及时指出,有则改之,无则加勉,祝各位大佬开发愉快。

 

 

你可能感兴趣的:(胖胖狼,fat,wolf,Android,targetSDK大于26,动态申请权限,Android,6.0,权限处理)