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()

关于此回调的触发说明:

  1. 如果app之前请求过该权限,被用户拒绝, 这个方法回回调。

  2. 如果用户之前拒绝权限的时候勾选了对话框中”Don't ask again”的选项,那么这个方法不会回调

  3. 如果设备策略禁止应用拥有这条权限, 这个方法也不会回调

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

标签:Android,HaloPermission
0
投稿

猜你喜欢

  • 将文件夹下所有文件输出到日志文件中 c#递归算法学习示例

    2023-04-08 20:36:22
  • C#调用Win32的API函数--User32.dll

    2022-04-13 16:43:24
  • 基于Springboot+Junit+Mockito做单元测试的示例

    2023-01-03 21:15:51
  • 详解android在mob平台实现qq登陆和分享

    2022-04-03 08:02:26
  • C#泛型实例详解

    2021-09-11 04:21:35
  • Unity3d 使用Gizmos画一个圆圈

    2022-05-22 05:10:52
  • Java探索之Thread+IO文件的加密解密代码实例

    2023-01-26 19:07:03
  • .net实现序列化与反序列化实例解析

    2022-08-05 06:42:08
  • 关于MyBatis中SqlSessionFactory和SqlSession简解

    2022-02-18 13:57:37
  • Java.try catch finally 的执行顺序说明

    2022-07-06 00:30:25
  • Java Cookie与Session实现会话跟踪详解

    2022-12-22 08:59:13
  • Java多线程(单例模式,堵塞队列,定时器)详解

    2022-09-18 16:22:20
  • SpringCloud Zuul自定义filter代码实例

    2023-12-03 02:49:50
  • SpringBoot自动配置源码深入刨析讲解

    2022-04-03 14:38:06
  • Java注解Annotation原理及自定义注解代码实例

    2023-04-30 10:18:09
  • 浅谈Spring中单例Bean是线程安全的吗

    2023-07-12 23:42:21
  • springboot bean循环依赖实现以及源码分析

    2022-06-05 11:50:15
  • java微信企业号开发之开发模式的开启

    2022-03-20 10:58:02
  • Struts2 $,#,%详解及实例代码

    2021-09-10 04:18:40
  • Java 爬虫服务器被屏蔽的解决方案

    2022-11-06 13:23:46
  • asp之家 软件编程 m.aspxhome.com