安卓权限申请封装处理框架。测试支持4.0+。项目源于正式处理Android权限问题时,没找到简单、能满足被拒绝权限自动会到系统设置处理的框架,按自己的编程习惯造一个熟悉的轮子还是蛮好的。第一次使用Android Studio,还是Eclipse敲代码爽。来自一个(独爱HTML+CSS来构建用户界面的)Android很早入门的新手。
项目用到了XXPermissions中的权限列表、国产手机权限设置页面跳转列表,借鉴了其中的权限结果onRequestPermissionsResult的接收方式。
Github:https://github.com/xiangyuecn/Android-UsesPermission
特性一个函数调用处理权限申请的所有问题,被拒绝的权限重复询问,被永久拒绝的权限(记住选择、不再询问)打开App授权系统设置。
函数式调用,代码简洁明晰,阅读源码不用跳来跳去。
明确的授权结果回调,要么有(True),要么没有(False)。
默认0界面,调用者无需知道、提供、导入任何界面包括文件,但可深度定制。
中性,默认非弓虽J式、有回旋余地的对待拒绝权限的场景。
理论上支持任何Android版本(但仅在 4.0 - 9.0 模拟器上进行了测试)。
演示可直接编译test_app项目进行测试,或者下载.assets/test_app-debug-xxx.apk测试安装包。
快速使用直接复制lib_comm/src/main/java/ecomm/lib_comm/permission里面的文件到你的程序里面即可使用。
示例代码 //假设需要获取摄像头、录音权限,直接在调用的地方实现抽象类,调用逻辑能简单直观不少 new UsesPermission(MainActivity.this, Permission.CAMERA, Permission.RECORD_AUDIO){ @Override protected void onTrue(@NonNull ArrayList<String> lowerPermissions) { //获取了全部权限执后行此函数, } @Override protected void onFalse(@NonNull ArrayList<String> rejectFinalPermissions, @NonNull ArrayList<String> rejectPermissions, @NonNull ArrayList<String> invalidPermissions) { //未全部授权时执行此函数 } //要么实现上面两个方法即可,onTrue或onFalse只会有一个会被调用一次 //要么仅仅实现下面这个方法,不管授权了几个权限都会调用一次 @Override protected void onComplete(@NonNull ArrayList<String> resolvePermissions, @NonNull ArrayList<String> lowerPermissions, @NonNull ArrayList<String> rejectFinalPermissions, @NonNull ArrayList<String> rejectPermissions, @NonNull ArrayList<String> invalidPermissions) { //完成回调,可能全部已授权、全部未授权、或者部分已授权 //通过resolvePermissions.contains(Permission.XXX)来判断权限是否已授权 } }; 默认行为逻辑先直接发起权限申请
普通权限(没永久拒绝的权限)如果被拒绝(非永久拒绝),后续会安排再弹框申请一次(防用户误选)。
如果授权结果有被永久拒绝的,这部分权限会和第二步权限申请一起弹框跳转到App授权系统设置。
弹一次框处理被永久拒绝的权限(弹一次够了),跳转到App授权系统设置界面。
可参考重写onTips方法修改此行为,做到不弹提示或者多次弹提示授权。
UsesPermission类文档import ecomm.lib_comm.permission.Permission;
这个类对外只有一个构造函数,直接new直接调起授权请求。使用过程中只需重写这个类的相应函数来控制授权请求行为。无多余、也不提供对外控制的方法。
构造函数 UsesPermission(activity,permissions,defaultTips="")调用构造函数立即会调起授权请求,对permissions列表中的权限进行申请。
请求过程中会根据onTips返回的结果来控制提示信息、和授权请求流程,defaultTips是onTips默认实现使用到的提示信息默认值,默认为""字符串;具体逻辑参考onTips。
回调类可重写函数这些函数都是可以选择重写,默认提供了空实现,不实现也没关系。
void onTrue(lowerPermissions)权限已全部授权时的回调,不管什么情况,onTrue和onFalse肯定有一个会回调。注意:方法内跟API版本有关的方法调用,应自行判断API版本,因为低版本API中高版本权限请求全部会放行。
lowerPermissions:如果是在低版本API上处理不支持的高版本新权限时,会忽略此项权限的检测的检测,默许放行,此时本参数将带上此权限。
void onFalse(rejectFinalPermissions,rejectPermissions,invalidPermissions)未授权时回调,不管什么情况,True和False肯定有一个会回调
rejectFinalPermissions:被永久拒绝的权限列表,为rejectPermissions的子集,空数组代表没有此项。
rejectPermissions:被拒绝的权限列表,空数组代表没有此项。
invalidPermissions:未在manifest里声明的权限列表,不会出现在rejectFinalPermissions中,空数组代表没有此项。
void onComplete(resolvePermissions,lowerPermissions,rejectFinalPermissions,rejectPermissions,invalidPermissions)授权完成时回调,会在onTrue和onFalse之一回调后调用。
resolvePermissions:已授权的权限列表。
lowerPermissions:参考onTrue,为resolvePermissions的子集。
剩余参数参考onFalse。
控制类可重写函数这些函数都是用来控制授权行为,都提供了默认实现。
String onTips(viewTipsCount,permissions,isFinal)