Android动态权限获取官方实现之easypermission

news2025/1/12 12:20:36

Android动态权限获取官方实现之easypermission

Android 6.0之后,基于用户隐私和安全考虑,敏感权限都开始采用动态运行时机制获取,于是就出现如果你不向用户申请权限(弹窗,用户选择),有些功能就无法正常运行,比如调用摄像头,所以我们通过动态获取权限的方式使功能可以正常使用。
permission dialog

官方文档参考:
(https://developer.android.google.cn/training/permissions/requesting?hl=zh-cn)
官方示例代码参考:
(https://github.com/android/permissions-samples/tree/main/RuntimePermissionsBasicKotlin)
在这个示例代码中,引入了一个easypermission的权限封装库,使用起来方便快捷。
easypermission实现:
(https://github.com/googlesamples/easypermissions)

easypermission引入

app/build.gradle

dependencies {
    ...
    implementation 'pub.devrel:easypermissions:3.0.0'
    ...
}

easypermission使用

Activity/Fragment实现EasyPermissions.PermissionCallbacks接口

EasyPermissions.PermissionCallbacks

Activity实现EasyPermissions.PermissionCallbacks接口
EasyPerssmions接口
我们也就需要实现接口里的所有方法,分别是onPermissionsGranted()onPermissionsDenied()方法,用来监听同意或拒绝权限回调,如果需要对用户永久拒绝的权限做提示就可以放onPermissionsDenied()方法实现:

override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
    for (temp in perms) {
        
        if (temp == android.Manifest.permission.CAMERA) {
            Log.e(_TAG, "CAMERA onPermissionsGranted")
        }
        
    }

}

override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
    Log.d(_TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size)
}

在我们的onPermissionsDenied()方法去实现对用户永久禁止相机权限提示到设置页去打开APP的相机权限,调用AppSettingsDialog方法弹窗提示:

override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
    Log.d(_TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size)
    val permissions = android.Manifest.permission.CAMERA
    if (perms.contains(permissions)) {
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            AppSettingsDialog.Builder(this)
                .setTitle("The permission has been denied by you")
                .setRationale("If you do not open the permission, you cannot use this function, click OK to open the permission")
                .setRequestCode(12345) 
                .build()
                .show()
        }
    }

然后我们去封装一个request()请求权限方法:

private fun request() {
    val permissions = arrayOf(
        android.Manifest.permission.CAMERA,
        //可以添加其他的权限,用来判断
    )
    //判断有没有权限
    if (EasyPermissions.hasPermissions(this, *permissions)) {
        // 有权限,需要做什么
    } else {
        // 没有权限, 申请权限
        EasyPermissions.requestPermissions(
            this,
            "摄像机需要用户允许才能调用,请开启相关权限(理由)",
            1,
            *permissions
        )
    }
}

我们使用EasyPermissionshasPermissions方法去判断是否给了权限,如果没有权限,我们使用requestPermissions方法去提示用户开启权限。
这个request()方法我们直接放在我们需要调用相关需要权限的地方即可,比如上一篇的使用摄像机的代码前面:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    ...

    // 判断是否要请求相机权限
    request()


    //请求CameraProvider
    cameraProviderFuture = ProcessCameraProvider.getInstance(this)

    cameraProviderFuture.addListener({
        val cameraProvider = cameraProviderFuture.get()
        bindPreview(cameraProvider)
    }, ContextCompat.getMainExecutor(this))
}

至此,基本的动态权限请求就完成了,我们去运行程序来看看效果:
首先是发现用户没有给相机权限提示:
camera permission dialog
然后如果拒绝,下一次进来APP就会提示用户:
权限申请提示
这个地方的逻辑注意,如果正常的话,应该放入拒绝的回调,这样用户拒绝时就能提示到用户。
最后是用户永久拒绝不提示时,我们的弹窗提示用户去设置权限的地方去开启:
权限拒绝提示

总结

用户的隐私更加安全,但需求也变得更难做,可还是值得提倡,让用户的权利得到保障!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter Android 打包保姆式全流程 2023 版

大家好&#xff0c;我是 17。 为什么要写这篇文章呢&#xff1f;对于一没有 android 开发经验&#xff0c;从未有过打包经历的新人来说&#xff0c;要想成功打包&#xff0c;是很困难的。因为受到的阻碍太多&#xff0c;是完全陌生的领域&#xff0c;几乎是寸步难行。如果有老…

hive真实表空间大小统计

1. 问题 如果是采用hdfs上传加载的表、或者是flume直接写hdfs的表空间通常看hive的属性是不准确的。 2. 思路 为了使结果更精确&#xff0c;我们直接使用linux下命令统计hive仓库目录下的每个表对应的文件夹目录占用空间的大小。 3. 解决方法 这里建立三层表结构 ods: 原始…

linux入门---粘滞位

为什么会有粘滞位 一台服务器有很多人使用&#xff0c;每个人在机器上都会有一个家目录&#xff0c;在家目录里可以实现自己想要的操作&#xff0c;但是有时候我们需要一个公共路径来完成一些操作&#xff0c;比如说资料分享产生临时文件的增删查改等等&#xff0c;这就好比我…

数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组

去重删除有序数组中的重复项题目来自&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/题目描述给你一个 升序排列 的数组 nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数…

leetcode 71~80 学习经历

leetcode 71~80 学习经历71. 简化路径72. 编辑距离73. 矩阵置零74. 搜索二维矩阵75. 颜色分类76. 最小覆盖子串77. 组合78. 子集79. 单词搜索80. 删除有序数组中的重复项 II小结71. 简化路径 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &am…

2023年再不会 IOC 源码,就要被淘汰了

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

详细聊TTL电平、RS232接口和RS485接口

TTL电平 TTL&#xff08;Transistor-Transistor Logic&#xff09;是一种数字电平标准&#xff0c;常用于数字电子设备之间的数据传输。 TTL使用0V表示逻辑0&#xff0c;使用5V表示逻辑1&#xff0c;因此TTL信号的电平比较容易理解和处理。TTL信号传输距离较短&#xff0c;通…

文件服务设计

一、需求背景 文件的上传、下载功能是软件系统常见的功能&#xff0c;包括上传文件、下载文件、查看文件等。例如&#xff1a;电商系统中需要上传商品的图片、广告视频&#xff0c;办公系统中上传附件&#xff0c;社交类系统中上传用户头像等等。文件上传下载大致流程为&#…

【Java诊断工具】Arthas使用指南

文章目录一、简介二、解决什么问题 & 适用场景解决问题&#xff1a;适应场景&#xff1a;三、安装&启动四、相关命令五、来自天边的"海市蜃楼"六、结束一、简介 Arthas 是Alibaba开源的Java诊断工具。安装在系统所在服务器。通过全局视角实时查看应用 load、…

人工智能论文术语集39

Resume 简历&#xff08;但在AI领域一般指&#xff1a;复位&#xff09;Perform arithmetic operations 执行算数操作performance measurement and improvement techniques 性能测试和改进技术draw stuff with your mouse 用鼠标画东西the Color Palette 调色板high dynamic ra…

41 42Ping-Pong操作

提高电路吞吐率的结构——Ping-Pong操作 1.Ping-Pong操作原理 作用&#xff1a;为了让两个不匹配的模块进行对接&#xff0c;并且在对接的过程中让这两个模块能够同时工作&#xff0c;提高数据处理的吞吐率&#xff08;也称throughput效能&#xff09; 常见的不匹配&#xff1…

Semaphore 源码解读

一、Semaphore Semaphore 通过设置一个固定数值的信号量&#xff0c;并发时线程通过 acquire() 获取一个信号量&#xff0c;如果能成功获得则可以继续执行&#xff0c;否则将阻塞等待&#xff0c;当某个线程使用 release() 释放一个信号量时&#xff0c;被等待的线程如果可以成…

idea初学笔记

注:初学需安装idea专业版&#xff0c;方便学习使用idea运行内存配置从eclipse工具开发 转 idea工具开发&#xff0c;可设置idea快捷键同eclipse快捷键 file -> Settings -> Keymap -> 选择Eclipse -> OK设置idea项目整体编码格式file -> Settings -> Editor …

mysql五种索引类型---实操版本

背景 最近学习了Mysql的索引&#xff0c;索引对于Mysql的高效运行是非常重要的&#xff0c;正确的使用索引可以大大的提高MySql的检索速度。通过索引可以大大的提升查询的速度。不过也会带来一些问题。比如会降低更新表的速度&#xff08;因为不但要把保存数据还要保存一下索引…

Linux【进程理解】

文章目录Linux【进程理解】一、冯诺依曼体系结构二、操作系统OS1.深入理解操作系统2.深入理解系统调用和库函数四、 进程&#xff08;一&#xff09;描述进程-PCB&#xff08;二&#xff09;组织进程和查看进程&#xff08;三&#xff09;通过系统调用创建进程-fork初识&#x…

【python】XML格式文件读写详解

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录XML介绍格式XML与AJAX与HTML区别联系生成XML文件案例用SAX模块处理XML用DOM模块处理XML&#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢&#xff1a;…

三:BLE协议架构简介

低功耗蓝牙体系整体架构说明1. PHY(物理层)2. LL(链路层)3. HCI(主机与控制器通信接口)4. L2CAP(逻辑链路控制及适配协议)5. ATT(属性协议)6. GATT(通用属性规范)7. GAP(通用访问规范)8. SM(安全管理)整体架构说明 架构层说明PHY1. 物理层2. 控制射频的发送和接收LL1. 链路层2.…

Java开发 - Quartz初体验

前言 在上一篇博客中&#xff0c;我们对单点登录有了初步了解&#xff0c;这也让我们独立做系统有了最基础的保障。但在业务开发中&#xff0c;总是会出现一些定期处理的任务&#xff0c;我们首先想到的是Timer&#xff0c;但由于其调度功能单一&#xff0c;我们实际并不会用它…

sqlmap工具说明

目录 1 工具简介 3 1.1 简述 3 1.2 背景及需求 3 1.3 主要功能 3 2 功能确认 4 2.1 安装和使用 4 2.1.1 Windows操作系统 4 2.1.2 Linux操作系统 6 2.1.3 Kali 7 2.2 添加目标 7 2.2.1 参数-u 7 2.2.2 参数-m 8 2.2.3 参数-r 9 2.3 指定参数 11 2.4 爆破数据库 11 2.5 爆破表 …

【LeetCode】剑指 Offer(16)

目录 题目&#xff1a;剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer …