Android 你想更加快速,更加优雅的申请权限?EasyPermissions

目录

1) 为什么需要权限呢?
2)EasyPermissions 是什么?
3)权限应该在什么时候提示用户申请呢?
4)具体流程原理。
5)如何使用。
6)使用到的类介绍。

一、为什么需要权限呢?

在Android6.0之后,谷歌对于应用程序权限进行的规范,对于特殊权限必须明确需要让用户授权。如果按照传统的方式,则写法非常复杂。

二、EasyPermissions

这里有一个好用的权限相关的库EasyPermissions。EasyPermissions 是 谷歌官方推荐 的动态权限申请库 ;可以简化我们申请权限的代码。

三、权限应该在什么时候提示用户申请呢?

  1. 在用户首次打开应用(app的主界面)或特定功能时,检查并请求必需的权限。
  2. 对已拒绝的权限进行重试或提示,引导用户到系统设置页面授权。
  3. 自定义权限请求对话框,提高用户体验。

四、具体流程原理

  1. 首先我们需要定义app所需要的权限。
  2. 然后让这个框架就会帮助我们验证这些权限,app是否已经授权,如果没有授权,就会提示用户去申请权限。
  3. 当用户所有权限都开启后,将不会再提示。

五、如何使用

(1)引入依赖

  // 使用 Android X 的应用添加该依赖
    implementation 'pub.devrel:easypermissions:3.0.0'

(2)比如我们清单文件里面需要申请这些权限

  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

(3)检查是否有对应的权限,如果没有将提示用户授予权限。

 /**
     * 第一步:填写需要检查是否授权的权限
     * *PERMMISSIONS 等同于可变参数
     */
    var PERMMISSIONS: Array<String> = arrayOf(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.INTERNET,
        Manifest.permission.READ_CONTACTS)


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main3)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        doSomethingWithPermissions()
    }

  
    /**
     * 第二步:检查是否有对应的权限,如果没有将提示用户授予权限。
     * 使用@AfterPermissionGranted(Companion.PERMISSION_REQUEST_CODE)注解来标记该函数需要在获取权限后执行。
     */
    @AfterPermissionGranted(Companion.PERMISSION_REQUEST_CODE)
    fun doSomethingWithPermissions(){

        Log.i(TAG, "doSomethingWithPermissions")

        // 调用 EasyPermissions.hasPermissions 方法判定是否已经申请该权限
        if(EasyPermissions.hasPermissions(this,
                *PERMMISSIONS)){
            // 如果有上述权限, 执行该操作
            Toast.makeText(this, "权限申请通过", Toast.LENGTH_LONG).show()
        }else{
            // 如果没有上述权限 , 那么调用requestPermissions申请权限,用户拒绝权限申请后 , 再次申请会自动弹出该对话框 ;
            EasyPermissions.requestPermissions(
                this,
                "权限申请原理对话框 : 描述申请权限的原理",
                Companion.PERMISSION_REQUEST_CODE,//权限请求的请求码。

                // 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组
                *PERMMISSIONS//要请求的权限数组
            )
        }
    }
  

```go
// 权限结果回调方法
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        // 将返回结果转给EasyPermissions
        //使用EasyPermissions.onRequestPermissionsResult()方法将权限请求结果转发给EasyPermissions库进行处理。 
        //EasyPermissions 收到结果后 , 会回调相关的回调函数(onPermissionsGranted or onPermissionsDenied )
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

(3)在用户授权成功,则会调用如下这个方法


    // 授予权限
    override fun onPermissionsGranted(requestCode: Int, list: MutableList<String>) {
        Toast.makeText(this@MainActivity, "权限授予了", Toast.LENGTH_SHORT).show();

    }

(4)用户拒绝授权,则会调用如下这个方法

 // 请求权限被拒
    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
        Toast.makeText(this@MainActivity, "权限拒绝了"+perms, Toast.LENGTH_SHORT).show()

        // 弹框提示用户跳转设置打开权限
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
        //如果用户在权限申请时 , 选择了 “拒绝 , 不要再询问” , 这是永久拒绝了应用的权限申请
        //此时可以调用AppSettingsDialog 对话框 , 该对话框的作用是引导用户前往设置界面 , 
        //自行为应用授权 ; 如果用户点击确定后会跳转到 设置 中的 应用信息 界面 , 
        //在该界面中 , 用户可以在 权限 选项中 , 手动为应用授权 ;

            AppSettingsDialog.Builder(this).build().show()
        }
    }

比如你点击了取消
在这里插入图片描述在这里插入图片描述如果你点击取消,则会继续在app里面,但有些功能可能会因为没有权限导致无法使用,如果你点击了确定,则会调用到系统里面全设置权限。

在这里插入图片描述

六、使用到的类介绍

@AfterPermissionGranted

AfterPermissionGranted 注解的作用是 , 当请求码对应的权限申请全部通过后,再次回调一次该方法 . ( 相当于调用了两次该方法 )。

@AfterPermissionGranted() 注解中使用常量 , 该常量只能使用 const val 定义 ;并且和requestPermissions 的参数三保持一致。

EasyPermissions类的方法

1)hasPermissions方法

检查当前的上下文对象 ( 应用 ) 是否被授权指定的权限集合,如果所有的权限都被授权了返回 true, 如果有一个权限没有被授予就会返回 false 。

 if(EasyPermissions.hasPermissions(this,
               *PERMMISSIONS)){
           // 如果有上述权限, 执行该操作
           Toast.makeText(this, "权限申请通过", Toast.LENGTH_LONG).show()
       }
2)requestPermissions 方法

申请一组权限, 如果系统要求 ( 用户之前拒绝过 ) , 显示 权限申请原理对话框 , 向用户表明申请该权限的原因 .
1.参数二:解释为什么申请改组权限的原因的信息;这些信息会在用户第一次拒绝权限申请后显示在 权限申请原理对话框 中。用户申请权限 , 如果是首次申请 , 该对话框不弹出 , 如果不是首次申请 , 并且之前拒绝过某些权限申请 , 就会弹出该对话框
2.参数三:追踪本次权限申请的申请码 , 必须小于 256.
3.参数四:要申请的权限数组。

EasyPermissions.requestPermissions(
                this,
                "权限申请原理对话框 : 描述申请权限的原理",
                Companion.PERMISSION_REQUEST_CODE,//权限请求的请求码。

                // 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组
                *PERMMISSIONS//要请求的权限数组
            )
3)onRequestPermissionsResult 方法

调用 EasyPermissions.onRequestPermissionsResult 的结果就是 , 如果用户同意了权限申请 , 就会回调 onPermissionsGranted 方法 , 如果用户拒绝了权限申请 , 就会回调 onPermissionsDenied 方法。

PermissionCallbacks

用于处理申请权限后,拒绝或同意而调用的回调接口。
他有两个函数。onPermissionsGranted和onPermissionsDenied

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前期后期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值