安卓权限申请封装处理框架。测试支持4.0+。项目源于正式处理Android权限问题时,没找到简单、能满足被拒绝权限自动会到系统设置处理的框架,按自己的编程习惯造一个熟悉的轮子还是蛮好的。第一次使用Android Studio,还是Eclipse敲代码爽。来自一个(独爱HTML+CSS来构建用户界面的)Android很早入门的新手。

项目用到了XXPermissions中的权限列表、国产手机权限设置页面跳转列表,借鉴了其中的权限结果onRequestPermissionsResult的接收方式。

特性

一个函数调用处理权限申请的所有问题,被拒绝的权限重复询问,被永久拒绝的权限(记住选择、不再询问)打开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 lowerPermissions) {

//获取了全部权限执后行此函数,

}

@Override

protected void onFalse(@NonNull ArrayList rejectFinalPermissions, @NonNull ArrayList rejectPermissions, @NonNull ArrayList invalidPermissions) {

//未全部授权时执行此函数

}

//要么实现上面两个方法即可,onTrue或onFalse只会有一个会被调用一次

//要么仅仅实现下面这个方法,不管授权了几个权限都会调用一次

@Override

protected void onComplete(@NonNull ArrayList resolvePermissions, @NonNull ArrayList lowerPermissions, @NonNull ArrayList rejectFinalPermissions, @NonNull ArrayList rejectPermissions, @NonNull ArrayList 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 permissions, boolean isFinal) {

if(viewTipsCount<=1) {

return "";

}

return null;

}

不授权永远弹提示

如果不授权功能是没法使用的场景,可以一直弹提示,直到用户点击了取消为止(可重写onCancelTips让无法取消,但不建议)。重写onTips方法:

protected String onTips(int viewTipsCount, @NonNull ArrayList permissions, boolean isFinal) {

if(viewTipsCount>0) {//如果需要授权调起前先提醒,直接把这个if去掉就行了

return "";

}

return null;

}

静默方式授权

如果权限被拒绝,不弹任何提示,也不跳转权限系统设置界面。仅仅用来调起授权请求。但对于需要引导才能进行权限设置的除外(如安装、悬浮窗权限)。重写onTips方法:

protected String onTips(int viewTipsCount, @NonNull ArrayList permissions, boolean isFinal) {

return null;

}

自定义提示界面

默认实现在弹提示的时候使用的是系统AlertDialog弹框,可重写onTipsDialogView方法来使用自己的提示界面。比如HiPermission的这种蛮美观友好的界面:

这个库不提供界面实现,需要自行实现。

更多实现

参考test_app目录中的MainActivity,里面有已实现的代码。

相关源码请前往Github查阅,如果这个库有帮助到您,请 Star 一下。

Android权限请求弹窗自定义,安卓权限申请处理框架Android-UsesPermission相关推荐

  1. android 加网络权限管理,Android添加用户组及自定义App权限的方法

    Android:4.4.4 一.应用场景 在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0: # ls -l /dev/ttyUSB0 crw-rw-- ...

  2. android fragment中引入自定义view_厉害了,用Android自定义View实现八大行星绕太阳3D旋转效果...

    作者:史蒂芬诺夫斯基 链接:https://www.jianshu.com/p/2954f2ef8ea5 好久没写View了,最近恰巧遇到一个八大行星绕太阳旋转的假3D效果,写完之后感觉效果还不错.能 ...

  3. android 坚挺通话广播_安卓版本最新占比 Android 4.4很坚挺

    原标题:安卓版本最新占比 Android 4.4很坚挺 又到了每月一次的统计安卓版本占比时间.根据这份2016年12月发布的最新数据,发布于2010年5月的Android 2.2系统,其市场占比已经低 ...

  4. 此版本专为旧版android打造,应用弹窗“此应用专为旧版Android打造,因此可能无法正常运行...”的原因...

    Android P上,有的应用打开时,会弹出对话框,内容:"此应用专为旧版Android打造,因此可能无法正常运行.请尝试检查更新或与开发者联系".用户会感到困惑,真正的原因是什么 ...

  5. Android程序记事本源码,安卓记事本程序源代码(Android Notepad program source code).doc...

    安卓记事本程序源代码(Android Notepad program source code).doc 安卓记事本程序源代码(Android Notepad program source code)1 ...

  6. limbo模拟器android版,limbo模拟器app[安卓虚拟机] v0.9.8 Android版

    limbo模拟器是一个安卓上的windows虚拟机,可以将Windows,Linux等系统在安卓或iOS手机上的模拟器.limbo是一款类似于bochs的软件,可以模拟x86平台,不同之处就是limb ...

  7. 好用的android模拟器!34岁安卓开发大叔感慨,Android面试题及解析

    优秀的战士需要出色的剑才能战斗.同样,在现代IT中,每个编码人员都需要最好的Android开发人员工具来提高他们的技能和效率.在Android应用程序开发这个残酷的竞争行业中,只有优秀的开发人员才能生 ...

  8. 安卓Permission权限请求

    AndroidPermission,权限自动请求示例(所需权限被关闭时,会自动请求) 权限请求源码:(将应用的Activity设为PermissionActivity的子类,即可自动请求所需权限) p ...

  9. 优雅地处理运行时权限请求

    前言 从android 6.0(API 级别 23)开始,android引入了运行时权限,用户开始在应用运行时向其授予权限,而不是在应用安装时向其授予权限,如果应用的某项功能需要使用到受运行时权限保护 ...

  10. Android提示用户获取相应手机权限

    一,简介 Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看 ...

最新文章

  1. Android系统默认Home应用程序(Launcher)的启动过程源代码分析
  2. Linux进程管理 (7)实时调度
  3. 香港大学赵恒爽助理教授招收CV/ML等方向全奖博士生、博士后
  4. [YTU ]_2736指针练习--输出最大值
  5. Starting MySQL.... ERROR! The server quit without updating PID file
  6. const char *p,char const *p, char * const p之间的区别
  7. 游戏服务器端引擎——DogSE的设计
  8. 释放锁的逻辑-InterProcessMutex.release
  9. nc 模拟服务器_NC集群服务器使用详解
  10. UML、XML、WebService,NUnit单元测试,测试驱动开发,httphandl,httpmodel
  11. C#——image与byte数组的转换
  12. mysql索引 删除和创建_mysql索引和唯一索引的创建和删除
  13. Java类的方法的理解
  14. [C# 网络编程系列]:TCP编程
  15. linux基本命令操作(二)
  16. 一文详解Matlab中Psychtoolbox工具箱的安装方法
  17. spring注解开发实例
  18. IExplore.exe应用程序错误解决方法
  19. mysql查询top10_各个数据库中TOP10记录的查询方法
  20. 2021洛谷10月月赛3游记

热门文章

  1. 小水智能-智慧工地与传统工地相比,数字科技赋予了以下三大优势
  2. alpha测试和betal测试
  3. Spark面试题(2)
  4. 北京大学网络教育学院计算机,北京大学继续教育部
  5. #2297. 战争调度(war)
  6. 计算机系统还原后 桌面不显示图标,电脑桌面图标不见了怎么恢复原状?电脑桌面便签不见了怎么找回...
  7. python在地图上标注点_只要两步,用Python将地址标记在地图上!
  8. 37.WLAN Qos介绍
  9. mysql批量插入on duplicate key update
  10. 【图像压缩】基于matlab余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】