安卓权限申请封装处理框架。测试支持4.0+。项目源于正式处理Android权限问题时,没找到简单、能知足被拒绝权限自动会到系统设置处理的框架,按本身的编程习惯造一个熟悉的轮子仍是蛮好的。第一次使用Android Studio,仍是Eclipse敲代码爽。来自一个(独爱HTML+CSS来构建用户界面的)Android很早入门的新手。java
项目用到了
XXPermissions
中的权限列表、国产手机权限设置页面跳转列表,借鉴了其中的权限结果onRequestPermissionsResult
的接收方式。git
Github:https://github.com/xiangyuecn/Android-UsesPermissiongithub
可直接编译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)来判断权限是否已受权 } };
可参考重写onTips
方法修改此行为,作到不弹提示或者屡次弹提示受权。app
import ecomm.lib_comm.permission.Permission;
框架
这个类对外只有一个构造函数,直接new
直接调起受权请求。使用过程当中只需重写这个类的相应函数来控制受权请求行为。无多余、也不提供对外控制的方法。ide
调用构造函数当即会调起受权请求,对permissions
列表中的权限进行申请。函数
请求过程当中会根据onTips
返回的结果来控制提示信息、和受权请求流程,defaultTips
是onTips
默认实现使用到的提示信息默认值,默认为""字符串;具体逻辑参考onTips
。测试
这些函数都是能够选择重写,默认提供了空实现,不实现也不要紧。
权限已所有受权时的回调,无论什么状况,onTrue
和onFalse
确定有一个会回调。注意:方法内跟API版本有关的方法调用,应自行判断API版本,由于低版本API中高版本权限请求所有会放行。
lowerPermissions
:若是是在低版本API上处理不支持的高版本新权限时,会忽略此项权限的检测的检测,默许放行,此时本参数将带上此权限。
未受权时回调,无论什么状况,True和False确定有一个会回调
rejectFinalPermissions
:被永久拒绝的权限列表,为rejectPermissions
的子集,空数组表明没有此项。
rejectPermissions
:被拒绝的权限列表,空数组表明没有此项。
invalidPermissions
:未在manifest
里声明的权限列表,不会出如今rejectFinalPermissions
中,空数组表明没有此项。
受权完成时回调,会在onTrue
和onFalse
之一回调后调用。
resolvePermissions
:已受权的权限列表。
lowerPermissions
:参考onTrue
,为resolvePermissions
的子集。
剩余参数参考onFalse
。
这些函数都是用来控制受权行为,都提供了默认实现。
整个类里面最核心,逻辑最复杂的一个方法(虽然默认实现只有3行代码)。此方法控制着整个权限请求的流程,弹不弹提示,尝不尝试从新申请,都是它说了算。
受权请求发起前会回调此方法,用来生成设置提示信息,也是来决定是否提示和进行受权。若是返回null,表明不进行下下一步操做;返回字符串会进行提示而后进行请求受权。注意:这个方法,会有不一样权限进行屡次调用;若是用户选点击了取消默认这些权限不会再调起请求(可重写onCancelTips
修改此行为)。
默认行为为:
viewTipsCount=0
viewTipsCount=1+
@param viewTipsCount 0-n 是第几回准备弹提示框。 0:申请前的引导提示,返回null表明不弹提示,直接调起受权。 注意:第0次包含全部权限(不含带自定义受权请求的权限),没法区分是否是永久拒绝的权限。 1+:被永久拒绝的权限申请,或普通权限上一轮被拒。 注意:为1的时候,若是权限带自定义的受权请求方式,就算返回了null,也会进行提示并调用受权请求。 @param permissions 被拒绝的权限列表 @param isFinal 这个权限列表是否是永久被拒绝的权限,true是,false为未永久拒绝 @return 返回提示信息;返回值为null不进行申请;为空字符串时自动生成合理的提示。 字符串内容支持特定占位符: {Auto}:用自动生成提示内容替换 {Names}:自动替换被拒绝的权限名称 如:'xx"{Names}"xx' => 'xx"权限名1,权限名2,权限名3"xx'
不建议重写,取消了也弹提示真不友好,弹出了提示时,用户点击了取消时的额外提示信息。返回null完全再也不调起提示,默认就是返回null。这个回调的用法和onTips
如出一辙,只是这个仅仅做用在点击了取消时。注意:重写这个方法应该慎重,最多viewCancelCount
几回后就返回null
,避免出现没法取消永远弹框的问题。
viewCancelCount
1-n
当前此次请求是第几回取消。
受权提示弹框,重写此方法自定义弹框行为,默认使用系统AlertDialog
弹框。只要求必须回调okCall
,cancelCall
中的任何一个,怎么显示界面、显示多少个界面 -> 随意。
import ecomm.lib_comm.permission.Permission;
这个类封装了8.0版本的危险权限列表,而且提供了对应的权限名称映射。
使用过程当中推荐使用这个类里面定义的权限,好比Permission.CAMERA
。若是用Manifest.permission.CAMERA
也能够,他们是等价的。
查询权限对应的名称,好比Permission.CAMERA
对应的名称为相机
。
获取权限名称列表,如权限名1,权限名2,权限名3
,此方法用于方便的生成受权提示信息。
不重写onTips
即为默认实现。
请求受权时直接弹出请求,用户若是点了拒绝(非永久),后续还会弹一次提示,防止误点。若是有被永久拒绝的权限,会弹提示,转到系统设置。
在调起受权前先弹提示,其余行为和默认实现同样。重写onTips
方法:
@Override protected String onTips(int viewTipsCount, @NonNull ArrayList<String> permissions, boolean isFinal) { if(viewTipsCount<=1) { return ""; } return null; }
若是不受权功能是无法使用的场景,能够一直弹提示,直到用户点击了取消为止(可重写onCancelTips
让没法取消,但不建议)。重写onTips
方法:
protected String onTips(int viewTipsCount, @NonNull ArrayList<String> permissions, boolean isFinal) { if(viewTipsCount>0) {//若是须要受权调起前先提醒,直接把这个if去掉就好了 return ""; } return null; }
若是权限被拒绝,不弹任何提示,也不跳转权限系统设置界面。仅仅用来调起受权请求。但对于须要引导才能进行权限设置的除外(如安装、悬浮窗权限)。重写onTips
方法:
protected String onTips(int viewTipsCount, @NonNull ArrayList<String> permissions, boolean isFinal) { return null; }
默认实如今弹提示的时候使用的是系统AlertDialog
弹框,可重写onTipsDialogView
方法来使用本身的提示界面。好比HiPermission
的这种蛮美观友好的界面:
这个库不提供界面实现,须要自行实现。
参考test_app
目录中的MainActivity
,里面有已实现的代码。
相关源码请前往Github查阅,若是这个库有帮助到您,请 Star 一下。