Android registerForActivityResult动态申请权限案例详解

前言

这几天在做一个小工具app,结果在fragment里面动态申请权限提示原有的申请方法已经弃用,还画了很明显的删除线。。。这叫一个强迫症的我怎么受得了。赶紧网上找资料也找不出什么结果,看了官方文档才发现了有registerForActivityResult这么一个神奇好用的函数,可以代替我们现有的startActivityForResult和权限申请函数。
那么下面就分两种情况来讲一下如何使用这个函数动态申请权限。

一、申请单个权限

首先,我们需要定义一个launcher:

ActivityResultLauncher<String> launcher = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
			result -> {
				if (result.equals(true)) {
					//权限获取到之后的动作
				} else {
					//权限没有获取到的动作
				}
			});

上面代码里的ActivityResultContracts.RequestPermission()就是告诉系统你要获取权限,result是返回结果
可以看出只要权限获取到了,这里result返回就是true,直接进行判断即可。
当然,只定义了这个launcher系统是不会执行的,因为这只是一个注册函数,还要在你需要执行的地方加入如下的代码:

button.setOnClickListener(view -> {
	launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
});

完成后当你点击这个button的时候,就会跳出申请读存储权限的提示。

二、获取多个权限

这里我以同时获取拍照和存储两个权限为例,三个及以上的原理类似。
和获取单个权限一样,获取多个权限也需要定义一个launcher:

ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
			result -> {
				if (result.get(Manifest.permission.CAMERA) != null
						&& result.get(Manifest.permission.READ_EXTERNAL_STORAGE) != null) {
					if (Objects.requireNonNull(result.get(Manifest.permission.CAMERA)).equals(true)
							&& Objects.requireNonNull(result.get(Manifest.permission.READ_EXTERNAL_STORAGE)).equals(true)) {
						//权限全部获取到之后的动作
					} else {
						//有权限没有获取到的动作
					}
				}
			});

和单个权限不同的是,多个权限传入的方法是ActivityResultContracts.RequestMultiplePermissions()。ActivityResultLauncher里面带的是一个string数组。返回值result的类型是map(样例如下表)。

申请的权限(String) 权限的申请结果(boolean)
Manifest.permission.CAMERA true/false
Manifest.permission.READ_EXTERNAL_STORAGE true/false

所以直接使用map里的get方法就可以获取每个权限对应的结果。我以为就这样结束了,结果编译器在我get方法这里画了黄黄的底色,一看提示说可能导致空指针异常。所以我就多加了Objects.requireNonNull,警告马上消失。
最后一步同样不能少,在需要获取权限的地方执行一下launch方法:

launcher.launch(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE})

三、总结

registerForActivityResult真的是个很好用的函数,要不是提示我之前的被弃用了我可能一直都不知道,不光可以代替获取权限方法,startActivityForResult方法也可以替换为这个函数。

到此这篇关于Android registerForActivityResult动态申请权限案例详解的文章就介绍到这了,更多相关Android registerForActivityResult动态申请权限内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android 如何实现动态申请权限

    OverView 今天在复习的时候,突然复习到我们的相机操作,但是对于相机操作,对于我来说比较复杂的是对于权限的操作.所有我们需要对我们的相机操作进行一些笔记的整理,加深记忆. 开发环境 Android Studio 3.6 Android 11(R) 该笔记使用 java 权限申请的基础知识 学习自:GOOGLE ANDROID DEVELOPERS 对于我们所需要申请的权限我们需要进行如下的操作. 我们需要将所有需要申请的权限添加到App/src/main/AndroidManifest.x

  • Android端权限隐私的合规化处理实战记录

    目录 是什么 为什么 具体实践 一.Android各版本对权限的适配处理 1.1 早期的注册权限 1.2 动态权限授予 1.3 READ_PHONE_STATE权限的变化 二.隐私信息合规化处理 2.1 隐私信息获取告知的直接化和透明化 2.2 隐私信息获取和传输的安全化 2.3 部分隐私Api调用的严格化 三.遇到的一些问题和坑 总结 是什么 对客户端而言,权限隐私可分为权限和隐私两个大的方面. 权限为用户通过app内弹窗设置或者手机设置内对应app的权限设置方式给予对应app相应的权限,如电

  • Android 版本、权限适配相关总结

    目录 请求存储权限 版本适配 Android 7.0 前 Android 7.0 后 Android 10.0 什么是作用域 举个栗子 请求存储权限 首先需要在 AndroidManifest.xml 文件中声明权限: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 在代码中请求用户权限: // 权限请求码 private static final int PERMISS

  • Android6.0 动态权限机制深入讲解

    前言 Android6.0以后引入了动态权限机制,一些系统权限的分配需要在app运行中进行分配,而不只是在AndroidManifest中指定. 本篇将针对动态权限的底层分配过程进行分析(基于Android-6.0.1). 权限分配 我们先看一下请求分配权限的代码 //frameworks/support/v4/java/android/support/v4/app/ActivityCompat.java public static void requestPermissions(final @

  • Android进程运行中权限被收回导致关闭的问题解决

    流程如图: MainActivity 跳转至 MainActivity2 再跳转至 MainActivity3MainActivity3 跳转至 设置,收回权限 一路返回 运行log如下 // 一路跳转,打开设置,收回权限 com.miss.soullink E/MainActivity: == onCreate == 25149 com.miss.soullink E/MainActivity: == onCreate == savedInstanceState null com.miss.s

  • Android6.0获取动态权限代码示例

    Android系统对所有的危险权限进行了分组,称为 权限组 .属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得该权限组下的所有权限(前提是相关权限在 AndroidManifest.xml 中有声明). 危险权限 和 权限组 列表如下: 在 AndroidManifest.xml 声明过的危险权限对应的权限组可以在系统 "设置" -> "应用" -> "应用信息" -> "权限"

  • android9.0 默认apk权限添加方法

    1.默认赋予全部权限: 安卓动态要求用户允许添加权限,直接将如下代码中的final boolean grantPermissions = (args.installFlags & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;改为final boolean grantPermissions=true便可. 文件路径:framework\base\services\core\java\com\android\server\pm\Pac

  • Android普通应用升级为系统应用并获取系统权限的操作

    有时候使用某些api需要使用系统权限,如调用PackageInstaller的相关接口,需要android.permission.INSTALL_PACKAGES权限,该权限系统只会授权给系统应用,此时可以考虑将我们的应用升级为系统应用,升级为系统应用有两种方法: 1.将apk放到/system/app目录下,重启手机即可,此方法比较粗暴,而且需要修改/system目录的读写权限,因此需要root,而且随着Android系统版本对权限管理越来越严,root和修改读写权限更繁琐和复杂 2.添加sh

  • Android registerForActivityResult动态申请权限案例详解

    前言 这几天在做一个小工具app,结果在fragment里面动态申请权限提示原有的申请方法已经弃用,还画了很明显的删除线...这叫一个强迫症的我怎么受得了.赶紧网上找资料也找不出什么结果,看了官方文档才发现了有registerForActivityResult这么一个神奇好用的函数,可以代替我们现有的startActivityForResult和权限申请函数. 那么下面就分两种情况来讲一下如何使用这个函数动态申请权限. 一.申请单个权限 首先,我们需要定义一个launcher: Activity

  • Android notifyDataSetChanged() 动态更新ListView案例详解

    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sc

  • Android Location服务之LocationManager案例详解

    上次介绍了位置服务中的Geocoder,这次就来介绍一下LocationManager.LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题,包括查询上一个已知位置.注册和注销来自某个LocationProvider的周期性的位置更新.注册和注销接近某个坐标时对一个已定义的Intent的触发等.今天我们就一起探讨一下LocationManager的简单应用. 在进入正题之前,朋友们需要了解与LocationManager相关的两个知识点: prov

  • Android Canvas之drawBitmap方法案例详解

    前面讲了paint,后面会花几篇主要讲讲canvas,并且由于最近项目比较紧,所以近期的文章都会"短小精悍": paint 作为画笔,里面有非常多而强大的设置方法,比如设置颜色过滤器,设置位图渲染.渐变,设置图像的混合模式等等,而canvas呢?里面提供了哪些利器可以为我们所用,一起来看看:           通过上图我们可以看到,canvas 里的方法基本可以分为这么几类: save.restore 等与层的保存和回滚相关的方法: scale.rotate.clipXXX 等对画布

  • Android 使用registerReceiver注册BroadcastReceiver案例详解

    android.context.ContextWrapper.registerReceiver public Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter) Register a BroadcastReceiver to be run in the main activity thread. The receiver will be called with any broadcast Intent

  • Android AlertDialog六种创建方式案例详解

    目录 一.setMessage:设置对话框内容为简单文本内容 二.setItem:设置文本框内容为简单列表项 三.setSingleChoiceItems()设置对话框内容为单选列表项 四.setMultiChoiceItems()设置对话框内容为多选项列表 五.setAdapter()设置对话框内容为自定义列表项(这里是一个布局) 六.setView()设置对话框为自定义View 创建AlertDialog的步骤: 创建AlertDialog.Builder对象 调用Builder对象的set

  • Android AlertDialog多种创建方式案例详解

    目录 一.setMessage:设置对话框内容为简单文本内容 二.setItem:设置文本框内容为简单列表项 三.setSingleChoiceItems()设置对话框内容为单选列表项 四.setMultiChoiceItems()设置对话框内容为多选项列表 五.setAdapter()设置对话框内容为自定义列表项(这里是一个布局) 六.setView()设置对话框为自定义View 创建AlertDialog的步骤: 创建AlertDialog.Builder对象 调用Builder对象的set

  • Android动画之TranslateAnimation用法案例详解

    我们在实际的开发过程中,有很多地方需要使用TranslateAnimation,本文是爱站技术频道小编为大家做的简单介绍,下面是详解Android 动画之TranslateAnimation应用的参数说明,希望对你学习这方面知识有帮助! android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 TranslateAnimation 位移动画效果 RotateAnimation 旋转动画效果 本节讲解TranslateAnimati

  • Android mvvm之LiveData原理案例详解

    1. 生命周期感知 1.1 生命周期感知组件 我们知道,Controller(Activity or Fragment) 都是有生命周期的,但是传统的 Controller 实现方式只负责 Controller 本身的生命周期管理,而与业务层的数据之间并没有实现良好解耦的生命周期事件交换.所以业务层都需要自己主动去感知 Controller 生命周期的变化,并在 Controller 的生存期处理数据的保活,而在消亡时刻解除与 Controller 之间的关系,这种处理方式随着业务规模的扩大往往

  • Android AS创建自定义布局案例详解

    先创建一个title.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" andr

随机推荐