Android权限HaloPermission详细使用
时间:2019-04-14
本文章向大家介绍Android权限HaloPermission详细使用,主要包括Android权限HaloPermission详细使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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())
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Codeforces 839D Winter is here【数学:容斥原理】
- Codeforces 839C Journey【DFS】
- Facebook的漏洞可以让攻击者在分分钟内重置用户账户密码
- 【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析
- 【机器学习笔记之六】Bagging 简述
- 洛谷 P1553 数字反转(升级版)【字符串+STL stack】
- C# 实现发送手机短信
- 软件测试人员必须掌握的Linux基本命令
- 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
- Capturing Packets in Linux at a Speed of Millions of PPS
- 【机器学习笔记之四】Adaboost 算法
- 【Java学习笔记之十九】super在Java继承中的用法小结
- 【Java学习笔记之二十一】抽象类在Java继承中的用法小结
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- String - 179. Largest Number
- 利用Github Pages实现“服务CNAME”功能
- String - 49. Group Anagrams
- Flutter包大小治理上的探索与实践
- String - 242. Valid Anagram
- String - 290. Word Pattern
- String - 205. Isomorphic Strings
- String - 345. Reverse Vowels of a String
- String - 186. Reverse Words in a String II
- String - 151. Reverse Words in a String
- String - 344. Reverse String
- String - 383. Ransom Note
- String - 58. Length of Last Word
- String - 14. Longest Common Prefix
- String - 28. Implement strStr()