Android权限HaloPermission详细使用
作者:SupLuo 发布时间:2021-08-18 07:14:46
1. 常规使用
请求一个权限,然后接收结果回调
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.setListener(object: PermissionListener{
override fun onPermissionDenied(permissions: List<String>) {
{your code for deny}
}
override fun onPermissionGrand(permissions: List<String>) {
{your code for grand}
}
}).run()
请求多个权限
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE)
.{省略代码}
//or
val permissions:Array<String> = arrayOf("","")
HoloPermission.with(this,*permissions)
.{省略代码}
只关心权限被允许(未被允许)的回调
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.setGrandAction(object:GrandAction{
override fun onPermissionGrand(permissions: List<String>) {
{your code for grand}
}
}).run()
2. RationaleRender使用
如果你想向用户解释请求权限的原因,你可以使用setRationaleRender方法
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略回调设置代码}
.setRationaleRender("为了确保功能的正常使用,请允许接下来的权限请求申请。")
.run()
如果你想自定义RationaleRender的样式,比如:
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略回调设置代码}
.setRationaleRender(object:RationaleRender{
override fun show(ctx: Context, permission: List<String>, process: RationaleRender.Process) {
//自定义使用了一个`Toast`展示信息。
Toast.makeText(ctx,"为了确保功能的正常使用,请允许接下来的权限请求申请。",Toast.LENGTH_SHORT).show()
//**为了确保后续的流程继续执行,你需要在适当的时候调用process的`onNext`或`onCancel`方法**
process.onNext()
//onNext()表示继续后面的执行
//onCancel会取消流程的执行,并且会最终回调onPermissionDenied方法
}
})
.run()
关于此回调的触发说明:
如果app之前请求过该权限,被用户拒绝, 这个方法回回调。
如果用户之前拒绝权限的时候勾选了对话框中”Don't ask again”的选项,那么这个方法不会回调
如果设备策略禁止应用拥有这条权限, 这个方法也不会回调
3. SettingRender使用
如果你想向用户解释请求权限的原因,你可以使用setRationaleRender方法
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略回调设置代码}
.setSettingRender("无法使用外部存储,请设置权限以便使用。")
.run()
如果你想自定义SettingRender的样式,比如:
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略回调设置代码}
.setSettingRender(object:SettingRender{
override fun show(ctx: Context, permission: List<String>, process: SettingRender.Process) {
//自定义使用了一个`Toast`展示信息。
Toast.makeText(ctx,"无法使用外部存储,请设置权限以便使用。",Toast.LENGTH_SHORT).show()
//**为了确保后续的流程继续执行,你需要在适当的时候调用process的`onNext`或`onCancel`方法**
process.onNext()
//onNext()表示继续后面的执行,HaloPermission将打开系统应用权限设置界面
//onCancel会取消流程的执行,不会打开系统应用权限设置界面,最终会回调onPermissionDenied方法
}
})
.run()
如果你觉得HaloPermission打开的权限设置界面不是您所满意的,你可以重写SettingRender的getCustomSettingIntent方法提供一个Intent,如果返回null则将使用HaloPermission的默认方式打开:
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略回调设置代码}
.setSettingRender(object:SettingRender{
override fun show(ctx: Context, permission: List<String>, process: SettingRender.Process) {
{省略的代码}
}
//自定义SettingIntent
override fun getCustomSettingIntent(ctx: Context): Intent? {
return super.getCustomSettingIntent(ctx)
}
})
.run()
4. 自定义权限校验规则
两步即可实现
//1. 创建自定义PermissionChecker
class CustomChecker:PermissionChecker{
override fun isPermissionGranted(ctx: Context, permission: String): Boolean {
{使用你的规则}
}
}
//2. 使用自定义规则
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略常规代码}
.run(CustomChecker())
除非你非常有把握,否则不建议使用自定义权限校验规则,因为HaloPermission会尽可能的去适配和兼容
5. 自定义请求方式
HaloPermission默认使用ShadowActivity的形式请求权限,当然只要你愿意,您可以使用Fragment的形式去实现,HaloPermission本身也提供了Fragment的请求方式,但是最终去掉了这部分的实现,因为对于Fragment的使用机制,如果使用不当,可能会出现一些奇怪的问题,我想这是你我都不愿看到的。同样的,两步即可实现自定义请求方式
//1. 创建自定义PermissionCaller
class CustomCaller: PermissionCaller{
override fun requestPermission(ctx: Context, responder: PermissionResponder, vararg permision: String) {
{可以仿造HaloPermission实现,最终要在适当的时候调用responder让流程正常进行}
}
}
//2. 使用自定义规则
HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.{省略常规代码}
.run(CustomCaller())
来源:https://www.jianshu.com/p/701b23cab139


猜你喜欢
- 这种情况,十有八九是SD存储卡的ext分区出错了,修复错误后重新开机即可重新启用a2sd+,找回原来安装的应用程序同修复FAT分区一样,这个
- 前言大家应该都遇到过,在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以
- 前言SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文
- 本文实例讲述了C#实现过滤sql特殊字符的方法集合。分享给大家供大家参考,具体如下:1./// <summary>/// 过滤不
- 写在前面之前想尝试把JWT和Shiro结合到一起,但是在网上查了些博客,也没太有看懂,所以就自己重新研究了一下Shiro的工作机制,然后自己
- Android-Room数据库(介绍)前言在SQLite数据库中,我们可以指定对象之间的关系,因此我们可以将一个或多个对象与一个或多个其他对
- 人机交互过程中,当我们需要机器给我们反馈不确定的数字结果时,就会需要用到随机数了,那么,在Java中,我们应当如何来生成并使用随机数呢?一、
- 场景描述在项目开发的过程中,需要修改调试的时候偶每次都需要重启项目浪费时间,下面是我整理的两种常用的两种方式方式一修改启动配置方式(主要针对
- 本文实例讲述了Android ListView的简单应用。分享给大家供大家参考,具体如下:我们今天要讲的内容是Android中ListVie
- 近日在工作中需要根据设备的HardwareID来获取设备的驱动程序信息,比如驱动程序版本等。经过摸索,得到了两种不同的解决办法,两种办法各有
- 1.SpringBoot AOP功能1.1 LTW与不同的切面织入时机AOP——面向切面编程,通过为
- 本文实例为大家分享了Android实现拍照或者选取本地图片的具体代码,供大家参考,具体内容如下总体流程从selectPhotoActivit
- 本文实例讲述了Android基于ViewPager实现的应用欢迎界面。分享给大家供大家参考,具体如下:有时候开发一个应用需要指导用户提示一些
- 实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询、长连接+长轮询、基于第三方插件(如FLASH的Socket
- Android资源文件大致可以分为两种:第一种是res目录下存放的可编译的资源文件:这种资源文件系统会在R.java里面自动生成该资源文件的
- from jnius import autoclass>>> Stack = autoclass('java.ut
- Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注)。它
- 一、问题分析入门案例的内容已经做完了,在入门案例中我们创建过一个SpringMvcConfig的配置类,再回想前面咱们学习Spring的时候
- 实现InsertOrUpdate功能需求最近在项目开发中遇到这样一个需求:每天需要对相同的数据(也有可能是不同的)进行两次入库操作,数据不存
- 前言前面介绍了APP顶部导航栏AppBar,今天来介绍下Flutter实现APP底部导航栏。我们以仿写微信的底部导航栏来举例说明。要实现类似