Android请求应用权限

文章目录

  • 前言
  • 参考
  • 一、请求应用权限基本原则
  • 二、请求权限的流程(官网摘抄)
  • 三、请求权限编码
    • 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 implementationimplementation("androidx.activity:activity:$activity_version")// Kotlinimplementation("androidx.activity:activity-ktx:$activity_version")
}
// Fragment引入
dependencies {val fragment_version = "1.5.4"// Java language implementationimplementation("androidx.fragment:fragment:$fragment_version")// Kotlinimplementation("androidx.fragment:fragment-ktx:$fragment_version")// Testing Fragments in IsolationdebugImplementation("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.rhkb.cn/news/45301.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android提示用户获取相应手机权限

一&#xff0c;简介 Android 6.0 为了保护用户隐私&#xff0c;将一些权限的申请放在了应用运行的时候去申请&#xff0c; 比如以往的开发中&#xff0c;开发人员只需要将需要的权限在清单文件中配置即可&#xff0c;安装后用户可以在设置中的应用信息中看到&#xff1a;XX应用…

安卓手机权限总结安卓权限列表

1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流 4.android.permission.WRITE_SMS允许程序写短信 5.androi…

手机特殊访问权限设置

前言 在使用手机过程中&#xff0c;权限设置比较重要&#xff0c;有一些特殊访问权限入口较为隐秘&#xff0c;例如电池优化权限&#xff0c;下面以华为鸿蒙系统为例&#xff0c;介绍如何设置特殊访问权限。 步骤 打开系统设置&#xff0c;进入应用和服务&#xff0c;进入权…

推荐几个优质的公众号!

点击上方“Python大本营”&#xff0c;选择“置顶公众号”Python大本营 IT人的职业提升平台技术之路就是漫长的打怪升级&#xff0c;不断学习前人的踩坑经验才能提升自己&#xff0c;切忌闭门造车。所谓独乐乐不如众乐乐&#xff0c;强烈推荐以下公众号&#xff0c;让你的生活…

微信公众号每日推送给女朋友的程序

微信公众日常推送保姆教程&#xff08;node版&#xff09; 1.先安装node环境(https://nodejs.org/en/) 安装过程就是&#xff1a;双击直接安装&#xff0c;不建议更改默认安装位置&#xff08;C:\&#xff09;&#xff0c;中途也保持默认设置&#xff0c;一路 “Next” 即可。…

推荐几个优质 IT 公众号

为大家推荐几个优质公众号&#xff1a; 学习需要技能&#xff0c;更需要有好的领路人&#xff0c;关注几个优质公众号&#xff0c;帮助你在学习中科学有效的成长。 以下是特地给大家挑选了几个大佬的优质号&#xff0c;强烈推荐关注。 人工智能爱好者社区 专注人工智能、机器学…

推荐9个最顶级的IT公众号

固步自封只会让自己落后于他人 如今&#xff0c;网络已将人与人之间的距离拉近 我们应开拓自己的眼界&#xff0c;结识更多的大能来丰富自己的知识 以下是8个技术公众号&#xff0c;每日共享最新的技术资讯。 快收下这波安利吧&#xff01; stormzhang stormzhang&#xff0c;大…

为大家推荐几个不错的公众号!

分享编程技能、互联网技术、生活感悟、打造干货分享平台&#xff0c;将总结的技术、心得、经验(数据结构与算法、源码分析)分享给大家&#xff0c;这里不只限于技术&#xff01;还有职场心得、生活感悟、以及面经。 工作、生活节奏超快的今天&#xff0c;想要不断提升自我&…

大模型技术发展概述 -(二)

文本内容参考论文《A Survey of Large Language Models》 论文标题&#xff1a;A Survey of Large Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -&#xff08;二&#xff09; 4. LLM预训练4.1 数据收集4.1.1 数据源4.1.2…

chatgpt赋能python:Python区域截图教程

Python区域截图教程 截图是我们常用的操作之一。有时候&#xff0c;我们只需要截取屏幕上的某个区域&#xff0c;而不是整个屏幕。这时&#xff0c;Python的区域截图功能可以派上用场。本文将为大家详细讲解Python如何实现区域截图。 Python区域截图&#xff1a;第三方库介绍…

chatgpt赋能python:Python实现滚动截屏

Python 实现滚动截屏 现代的网页通常都会使用滚动条来展示更多的信息&#xff0c;但是传统的截图工具并不能完整地截取整个网页内容&#xff0c;因此需要使用更加智能的截屏工具。本文将介绍使用 Python 实现滚动截屏的方法。 使用 Python 的优势 Python 是一门高效的编程语…

真机telnet登录eNSP防火墙USG6000V

这次说说真机telnet防火墙USG6000V的配置方法&#xff0c;拓扑如下 cloud1配置省略。 首先呢是配置一下端口的ip、安全区域等等 接下来就是配置telnet了&#xff08;见下图&#xff09; 开启USG6000V的telnet服务 测试一下 输入用户名和密码就成功登录了 抓个包看看 可以看到…

【学习笔记】unity脚本学习(四)【inputManager、键盘输入、鼠标输入、Raycast】

目录 输入inputManagerHorizontal虚拟轴的各个属性含义&#xff08;摘选自ChatGpt&#xff0c;部分回答不准确&#xff09;键值的含义键名称命名约定&#xff1a; 键盘输入静态函数GetKeyGetButtonKeyCodeGetButton/Down/upGetAxisGetAxisRaw 返回由 axisName 标识的虚拟轴的值…

【Unity3D】用InputField做一个简易UI,为GameObject的高度y赋值

目录 一些废话之前卡过的bugInputField更新了类名&#xff0c;引用后无法拖拽单独对GameObject的Transform.position中的某一坐标赋值float.Parse()&#xff0c;格式报错FormatException点击按钮&#xff0c;值只改变了一瞬间又回到原来状态 完整代码后记 一些废话 我是一只总…

【Unity入门】3.3D物体

【Unity入门】3D物体 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;物体移动旋转缩放 &#xff08;1&#xff09;物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…

UnityWeb端和Js互调(MQTT通讯篇)

TOC关于Unity与Js互调&#xff08;MQTT通讯篇&#xff09;踩了很多坑接下来总结一下 总体思路 工程项目当时是PC端项目转成Web端项目。PC端采用的通讯方式是MQTT通讯订阅端&#xff0c;而如果发布成Web端的话不能直接进行MQTT通讯&#xff0c;就想了个办法通过Unity与JS互调的…

Unity Houdini插件编写data Table传递数据给Houdini

上次说到Unity Houdini插件将Tag设为group&#xff0c;里面用到了自定义输入接口。然后那个Houdini教程又给我出难题了&#xff0c;unreal 可以用一种叫data Table的数据结构来完成向Houdini结构化数据的传递&#xff08;链接&#xff09;&#xff0c;我没找到Unity类似的功能&…

【Unity】动态生成圆环体Mesh

代码由ChatGPT生成&#xff0c;后经人工调整。 /// <summary> /// 创建一个3维圆环体Mesh。 /// </summary> /// <param name"outerRadius">外半径。</param> /// <param name"innerRadius">内半径。</param> /// <…

关于vsCode中文插件突然无效的解决办法

今天今天github上下载了一个devtools 用vsCode打开,发现中文插件无效了 解决办法: 按ctrlshiftp 输入Configure Display Language 在弹出的语言中&#xff0c;选中zh-cn 然后重启vsCode

Android的EditText超出字数限制,给用户提示

Android的EditText超出字数限制&#xff0c;给用户提示 导语 如果项目着急使用&#xff0c;直接将下面代码复制到项目中&#xff0c;当做自定义的EditText使用就可以了。 建议将后面的解决思路看一遍&#xff0c;增强自己阅读源码的能力。 自定义的MaxLengthEditText /*** C…