安卓权限申请处理框架Android-UsesPermission
安卓权限申请封装处理框架。测试支持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)
整个类里面最核心,逻辑最复杂的一个方法(虽然默认实现只有3行代码)。此方法控制着整个权限请求的流程,弹不弹提示,尝不尝试重新申请,都是它说了算。
授权请求发起前会回调此方法,用来生成设置提示信息,也是来决定是否提示和进行授权。如果返回null,代表不进行下下一步操作;返回字符串会进行提示然后进行请求授权。注意:这个方法,会有不同权限进行多次调用;如果用户选点击了取消默认这些权限不会再调起请求(可重写onCancelTips
修改此行为)。
默认行为为:
- 先直接发起权限申请
viewTipsCount=0
- 普通权限(非永久拒绝)如果被拒绝(非永久拒绝),后续会安排再弹框申请一次(防误选)。
- 如果结果有被永久拒绝,这部分权限会和后面的永久权限申请一起弹框处理。
- 弹一次框处理被永久拒绝的权限(弹一次够了),跳转到App授权系统设置界面
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'
String onCancelTips(viewCancelCount,permissions,isFinal)
不建议重写,取消了也弹提示真不友好,弹出了提示时,用户点击了取消时的额外提示信息。返回null彻底不再调起提示,默认就是返回null。这个回调的用法和onTips
一模一样,只是这个仅仅作用在点击了取消时。注意:重写这个方法应该慎重,最多viewCancelCount
几次后就返回null
,避免出现无法取消永远弹框的问题。
viewCancelCount
1-n
当前这次请求是第几次取消。
String onTipsDialogView(tips,isCancel,viewTipsCount,permissions,isFinal,okCall,cancelCall)
授权提示弹框,重写此方法自定义弹框行为,默认使用系统AlertDialog
弹框。只要求必须回调okCall
,cancelCall
中的任何一个,怎么显示界面、显示多少个界面 -> 随意。
Permission类文档
import ecomm.lib_comm.permission.Permission;
这个类封装了8.0版本的危险权限列表,并且提供了对应的权限名称映射。
权限列表
使用过程中推荐使用这个类里面定义的权限,比如Permission.CAMERA
。如果用Manifest.permission.CAMERA
也可以,他们是等价的。
静态方法
String QueryName(permission)
查询权限对应的名称,比如Permission.CAMERA
对应的名称为相机
。
String QueryNames(permissions)
获取权限名称列表,如权限名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 一下。
安卓权限申请处理框架Android-UsesPermission的更多相关文章
- Android 6.0 超级简单的权限申请2 (Permission)
代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...
- 关于安卓6.0权限申请 PermissionDog
最近在一家公司实习,项目中需要用到适配安卓6.0以上的系统,我本来是想用其他人已经写好的权限申请框架来实现的,但是发现跟我的需求有点小区别,所以就自己写了一个 这个权限申请的帮助类很小,只有一个jav ...
- Android 6.0 权限申请辅助 ----PermissionsHelper
Android 6.0 权限申请辅助 ----PermissionsHelper 项目地址:https://github.com/didikee/PermissionsHelper Android 的 ...
- ## Android 6.0 权限申请 ##
Android 6.0 权限申请 1. 以前的权限申请(sdk<23) 直接在AndroidManifest.xml中申明即可: <uses-permission android:name ...
- Android 6.0 动态权限申请注意事项
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/uana_777/article/details/54136255 Part One 权限区分 And ...
- Android 6.0动态权限申请教程
转载请标明出处: http://www.cnblogs.com/why168888/p/6580396.html 本文出自:[Edwin博客园] PermissionManage 介绍 如果设备运行的 ...
- Android 6.0 超级简单的权限申请 (Permission)
代码地址如下:http://www.demodashi.com/demo/13369.html 背景描述 随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐 ...
- Android 6.0 动态权限申请
1. 概述 Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户.在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在 ...
- Android 动态权限申请
package com.dragon.android.permissionrequest; import android.Manifest; import android.content.Dialog ...
随机推荐
- python appium笔记(二):元素定位
#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境 #环境配置和一些参数的意思不清楚可以看我上一篇python appium笔记(一) ...
- JAVA设计模式——代理(动态代理)
传送门:JAVA设计模式——代理(静态代理) 序言: 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring ...
- 关于一体机打印新加菜按钮更改为下单小票打印设置FAQ(适用正餐6.0.1.0+,轻餐4.0.6.2+)
适用版本:正餐6.0.1.0+,轻餐4.0.6.2+ 实际场景:更新后小票设置中的打印新加菜按钮更换为下单小票打印设置,更换后,设置中,有3个选项: 1.仅打印新加菜 (选中后,订单加菜后前台小 ...
- SQL Server如何用触发器捕获DML操作的会话信息
需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数 ...
- 前后端分离djangorestframework——分页组件
Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用 前后端分离djangorestframework——序列化与反序列化数据 文章里用到的数据,数据库用的my ...
- 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...
- 预热一下吧《实现Redis消息队列》
应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...
- Windows Server 2016-管理Active Directory复制任务
Repadmin.exe可帮助管理员诊断运行Microsoft Windows操作系统的域控制器之间的Active Directory复制问题. Repadmin.exe内置于Windows Serv ...
- Pyqt5+python+ErIC6+QT designer
Eric6安装及配置 https://blog.csdn.net/weixin_41656968/article/details/80253012 Python3.6+PyQt5+Eric6.0环境配 ...
- VueJs入门(一)
VueJs学习笔记:基本概念及简单demo Vue官方介绍:简单小巧的核心,渐进式技术栈,足以应付任何规模的应用. 简单小巧指的是vue.js压缩后仅有17KB,量轻.渐进式指的是我们学习和使用vue ...