Android请求应用权限

news2024/12/24 10:16:51

文章目录

  • 前言
  • 参考
  • 一、请求应用权限基本原则
  • 二、请求权限的流程(官网摘抄)
  • 三、请求权限编码
    • 1.允许系统管理权限请求代码
    • 2.自行管理权限请求代码
  • 总结


前言

  • 学习Android为什么需要动态申请危险权限
  • 学会Android应用危险权限申请的方式

参考

  • Android官方文档:请求应用权限
  • 评估您的应用是否需要申请权限,系统提供了一些平替方案,例如拍照、录制视频可以不申请Camera权限

一、请求应用权限基本原则

1、当用户开始与需要相关权限的功能互动时,在具体使用情境下请求权限。
解释:在权限需要被使用的功能去申请。早期的应用基本都是把所有的权限放在应用启动去申请,用户不同意所有权限直接阻断了用户使用软件的权利,这是不可取的,因为一个应用中有很多功能是不需要某个特定权限就能够被使用的。
2、不要阻止用户使用应用。始终提供选项供用户取消指导界面流程,例如说明请求权限理由的流程。
解释:还是第一条解释的原因,不要因为用户不同意某一个单一功能的权限而阻止用户使用其他功能。
3、如果用户拒绝或撤消某项功能所需的权限,请适当降级您的应用以便让用户可以继续使用您的应用(可能通过停用需要权限的功能来实现)。
解释:用户如果拒绝了某个功能需要的权限,那就提醒用户此功能需要打开需要的权限才能被使用,用户不同意权限就不能使用当前功能。
4、不要对系统行为做任何假设。例如,假设某些权限会出现在同一个权限组中。权限组的作用只是在应用请求密切相关的多个权限时,帮助系统尽可能减少向用户显示的系统对话框数量。
解释:明确指定需要使用的特殊权限,比如读写sdcard权限,如果读写权限都需要,那就都需要动态申请。

二、请求权限的流程(官网摘抄)

  1. 在应用的清单文件中,声明应用可能需要请求的权限。

    如需声明应用可能请求的权限,请在应用的清单文件中添加相应的 元素。例如,如果应用需要访问相机,则应在 AndroidManifest.xml 中添加以下代码行:

<manifest ...>
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>
  1. 设计应用的用户体验,使应用中的特定操作与特定运行时权限相关联。告知用户哪些操作可能会要求他们向您的应用授予访问其私人数据的权限。

    设计UX告知用户我们可能需要申请的权限,以及为什么需要使用这些权限,应用在哪些功能

  2. 等待用户调用应用中需要访问特定用户私人数据的任务或操作。届时,您的应用可以请求访问相应数据所需的运行时权限。

    就是当用户调用特定的功能的时候再去申请权限,不要提前申请权限,因为有些需要权限的功能可能用户都不会用到,但是我们不能阻止用户使用其他功能

  3. 检查用户是否已授予应用所需的运行时权限。如果已授权,那么您的应用可以访问用户私人数据。如果没有,请继续执行下一步。每次执行需要该权限的操作时,您都必须检查自己是否具有该权限。

    通过Android的ContextCompat.checkSelfPermission()方法检测用户是否已经授权,每次执行都需要判断权限是否授予,因为用户可用通过应用信息主动关闭权限

  4. 检查您的应用是否应向用户显示理由,说明您的应用需要用户授予特定运行时权限的原因。如果系统确定您的应用不应显示理由,请继续直接执行下一步,无需显示界面元素。

    不过,如果系统确定您的应用应该显示一个理由,请在界面元素中向用户显示理由,明确说明您的应用试图访问哪些数据,以及应用获得运行时权限后可为用户提供哪些好处。用户确认理由后,请继续执行下一步

    就是当用户执行了拒绝之后,就会走到当前步骤,我们需要给用户展示为什么需要使用这个权限,并且引导用户去权限设置中打开当前权限

  5. 请求您的应用访问用户私人数据所需的运行时权限。系统会显示运行时权限提示,例如权限概览页面上显示的提示。

调用申请权限的方法,系统弹出权限申请弹窗
当应用请求运行时权限时显示的系统权限提示。

7.检查用户的响应,他们可能会选择同意或拒绝授予运行时权限。

用户可以在弹窗选择同意或者拒绝,或者只是同意当前一次权限

  1. 如果用户向您的应用授予权限,您就可以访问用户私人数据。如果用户拒绝授予该权限,请适当降低应用体验,使应用在未获得受该权限保护的信息时也能向用户提供功能。

    当用户选择不同意当前权限时候,我们不提供当前功能给用户使用

官网Copy过来的,在 Android 上声明和请求运行时权限的工作流。
在 Android 上声明和请求运行时权限的工作流。

三、请求权限编码

1.允许系统管理权限请求代码

在模块的 build.gradle 文件中添加以下库的依赖项:

  • androidx.activity,版本 1.2.0 或更高版本
  • androidx.fragment,版本 1.3.0 或更高版本
// Activity引入
dependencies {
    val activity_version = "1.6.1"
    // Java language implementation
    implementation("androidx.activity:activity:$activity_version")
    // Kotlin
    implementation("androidx.activity:activity-ktx:$activity_version")
}
// Fragment引入
dependencies {
    val fragment_version = "1.5.4"
    // Java language implementation
    implementation("androidx.fragment:fragment:$fragment_version")
    // Kotlin
    implementation("androidx.fragment:fragment-ktx:$fragment_version")
    // Testing Fragments in Isolation
    debugImplementation("androidx.fragment:fragment-testing:$fragment_version")
}

使用如下两个协定类进行权限申请:

  • 如需请求一项权限,请使用 RequestPermission。
  • 如需同时请求多项权限,请使用 RequestMultiplePermissions。

例子使用RequestMultiplePermissions进行请求,RequestPermission是类似的,申请单一权限的例子官网上有,可以查看官网的例子

  1. 在 activity 或 fragment 的初始化逻辑中,将 ActivityResultCallback 的实现传入对 registerForActivityResult() 的调用。ActivityResultCallback 定义应用如何处理用户对权限请求的响应。

    保留对 registerForActivityResult()(类型为 ActivityResultLauncher)的返回值的引用。

  2. 如需在必要时显示系统权限对话框,请对您在上一步中保存的 ActivityResultLauncher 实例调用 launch() 方法。

    调用 launch() 之后,系统会显示系统权限对话框。当用户做出选择后,系统会异步调用您在上一步中定义的 ActivityResultCallback 实现。

companion object {
    private val PERMISSION_ARR = arrayOf(
        Manifest.permission.RECORD_AUDIO,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA
    )
}

private fun handlePermission() {
        PERMISSION_ARR.forEach { permission ->
            when {
                ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED -> {
                    Log.d(TAG, "权限允许:: $permission")
                }
                shouldShowRequestPermissionRationale(permission) -> {
                    // 在此处给用户解释为甚么需要申请此权限
                    Log.d(TAG, "权限拒绝:: $permission")
                }
                else -> {
                    requestPermissionLauncher.launch(PERMISSION_ARR)
                }
            }
        }
    }

    private val requestPermissionLauncher: ActivityResultLauncher<Array<String>> =
        registerForActivityResult(RequestMultiplePermissions()) { map ->
            map?.keys?.forEach { key ->
                // key是权限,value是当前权限的是否被允许的boolean值
                // 申请权限之后的操作就在此执行
                Log.d(TAG, "permission key:: $key, isGranted:: ${map[key]}")
            }
        }

2.自行管理权限请求代码

companion object {
        private const val TAG = "MainActivity"

        private val PERMISSION_ARR = arrayOf(
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA
        )

        private const val PERMISSION_REQUEST_CODE = 100
    }

private fun handlePermission() {
        PERMISSION_ARR.forEach { permission ->
            when {
                ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED -> {
                    Log.d(TAG, "权限允许:: $permission")
                }
                shouldShowRequestPermissionRationale(permission) -> {
                    Log.d(TAG, "权限拒绝:: $permission")
                }
                else -> {
                  // 请求权限
                    requestPermissions(arrayOf(permission), PERMISSION_REQUEST_CODE)
                }
            }
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            PERMISSION_REQUEST_CODE -> {
                if ((grantResults.isNotEmpty() &&
                            grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    // 权限允许 
                    
                } else {
                    // 权限不允许,不能允许用户使用
                   
                }
                return
            }
            else -> {
                // Ignore all other requests.
            }
        }
    }

总结

就是简单的自己使用总结,基本上的东西都是官网有的。
建议使用第一种方式,因为在Fragment和Activity中都可以玩

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

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

相关文章

8 种 Python 定时任务的解决方案

在日常工作中&#xff0c;我们常常会用到需要周期性执行的任务&#xff0c;一种方式是采用 Linux 系统自带的 crond 结合命令行实现&#xff0c;另外一种方式是直接使用Python。 最近我整理了一下 Python 定时任务的实现方式&#xff0c;内容较长&#xff0c;建议收藏后学习&a…

uni-app云开发(我直接访问后端)

uniCloud 是 DCloud 联合阿里云、腾讯云&#xff0c;为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 熟悉的js的程序员&#xff0c;轻松搞定前后台整体业务。实现了前端完成前后端工作的可能 用法&#xff1a; 第一步新建uniCloud项目 点击文件 ——>新建—…

Hue编译安装使用

简介 由于大数据框架很多&#xff0c;为了解决某个问题&#xff0c;一般来说会用到多个框架&#xff0c;但是每个框架又都有自己的web UI监控界面&#xff0c;对应着不同的端口号。比如HDFS(9870)、YARN(8088)、MapReduce(19888)等。这个时候有一个统一的web UI界面去管理各个大…

高斯混合模型下的变分推断

大概从下面几个部分学习&#xff1a; 1.EM算法 人人都懂EM算法 - 知乎 (zhihu.com) 18分钟理解EM算法 - 知乎 (zhihu.com) 变分贝叶斯深度学习综述 - 知乎 (zhihu.com) 【未看完】 EM算法存在的意义是什么&#xff1f; - 知乎 (zhihu.com)【八种境界】 EM 算法具备收敛性…

java计算机毕业设计ssm体育赛事管理系统App2qrcr(附源码、数据库)

java计算机毕业设计ssm体育赛事管理系统App2qrcr&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#x…

[附源码]Python计算机毕业设计Django酒店物联网平台系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

小目标检测文章阅读

无人机上目标检测的特点&#xff1a; 1、图像特点 在多数情况下&#xff0c;无人机的拍摄视野很大&#xff0c;包含丰富的视觉内容&#xff0c;虽然它提供了更全面的场景信息。 缺点&#xff1a; 1&#xff09;但是待检测的目标对象通常在图像中占比较小&#xff0c;且没有足…

法国巴黎索邦大学博士后—实验物理学

【国外博士后招聘-法国博士后】法国巴黎索邦大学博士后—实验物理学 索邦大学&#xff08;法文&#xff1a;Sorbonne Universit&#xff1b;英文&#xff1a;Sorbonne University&#xff09;简称“索邦”&#xff08;Sorbonne&#xff09;&#xff0c;是一所位于法国巴黎拉丁区…

多线程环境下的单例模式

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE初阶】 &#x1f432;&#x1f432;本篇内容&#xff1a;基于多线程的单例模式 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程…

Linux虚拟化网络之路由配置

一、Linux路由配置 如果要在不同网段直接通讯&#xff0c;需要添加路由&#xff0c;Linux添加路由命令如下&#xff1a; route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If] add : 添加一条路由规则&#xff1b;del : 删除一条路由规则&#xff1b;-net …

Win11如何开启移动中心页面的操作方法教学

Win11如何开启移动中心页面的操作方法教学分享。有用户不知道怎么去打开移动中心&#xff0c;开启这个页面我们可以去进行屏幕亮度调整、声音调整、笔记本电池状态、外接显示器/投影仪、以及幻灯片显示模式等功能集中到一个面板上进行管理设置。如何开启这个页面&#xff0c;来…

【教程】超详细通过Shizuku转生支付宝集成XQ_Crystal来自动收能量

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.blog.csdn.net] 通过Shizuku是比应用转生更好更稳定的方法&#xff01; 可以先看这篇&#xff1a;免Root使用Xposed插件并开启蚂蚁森林自动偷能量,比应用转生好 还不会的&#xff0c;继续往下。看完还不会&#xff…

手机银行APP评测系列:天津银行持续优化手机银行用户体验,但仍需加强细节提升

易观分析&#xff1a;作为银行金融服务线上场景渗透的有效抓手&#xff0c;当前手机银行APP已经成为其触达用户的重要渠道。随着银行发力场景服务平台成为发展趋势&#xff0c;5G技术问世对金融服务场景端提出新要求&#xff0c;用户体验反馈成为银行线上场景化运营的重要一环。…

JavaScript—分支结构和循环结构整理

目录 一、流程控制 二、分支结构 1. if语句 2. if…else语句 3. if…else if语句 4. switch语句 5. 条件表达式构成的选择结构 三、循环结构 1.while循环 2. do-while循环 3. for循环 3.1 for循环转换为while循环 3.2 断点调试 4. 循环嵌套 JavaScript 是一种解释…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.6 FanoutExchange

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.6 FanoutExchange16.6.1 发布订阅 - Fanout Exchange16.6…

火山引擎DataTester:一个爆款游戏产品,是如何用A/B测试打磨出来的?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 随着国内游戏用户数量趋于饱和&#xff0c;中国游戏产业也从高速成长期逐渐转型&#xff0c;市场成熟度提升&#xff0c;竞争趋于精细化。 随着游戏出海以及私域流…

Java开发学习(二十六)----SpringMVC返回响应结果

SpringMVC接收到请求和数据后&#xff0c;进行了一些处理&#xff0c;当然这个处理可以是转发给Service&#xff0c;Service层再调用Dao层完成的&#xff0c;不管怎样&#xff0c;处理完以后&#xff0c;都需要将结果告知给用户。 比如:根据用户ID查询用户信息、查询用户列表、…

2022世界杯La‘eeb肖像,python海龟实现啦

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 目录 一、Laeeb的身世 二、开始作画 1、准备阶段 2、常用指令 3、开始做画 一、Laeeb的身世 2022年卡塔尔世界杯&#xff08;英语&#xff1a…

华为机试 - 高效的任务规划

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 你有 n 台机器&#xff0c;编号为 1~n&#xff0c;每台都需要完成一项工作&#xff0c;机器经过配置后都能完成独立完成一项工作。假设第 i 台机器你需要花 B 分钟进行设置&#xff0c;然后开始运行&a…

[附源码]计算机毕业设计室内设计类网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…