前文:说到现在的手机系统,版本高,事却多了,自从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
故此处也有回调方法
此时,简单的动态申请一个权限完成了。
此时,可能有的需求会一次申请多个权限,如果分开写,便会代码太臃肿,下面讲解如何一次申请一个权限组。
1、写出需要申请的权限组
2、
将权限组遍历检查权限
3、回调中对权限进行处理,与单个权限的回调相同
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, permissions[i]);//遍历检查权限
走到这一步,对权限跟权限组的动态申请已经实现了,但是代码用的地方很多,此处,做一个简单封装,供大家参考,各位大佬也可以根据自己的习惯做封装。
工具类中传入三个状态值即可,回调则写在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第一次修改时候遇到的坑,希望各位大佬开发时候多加注意,此处建议封装使用,有利于代码维护,最后,如果本篇有错误之处请及时指出,有则改之,无则加勉,祝各位大佬开发愉快。