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

 更新时间:2021年09月09日 15:08:56   作者:Karry学长  
这篇文章主要介绍了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动态申请权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android中BaseActivity自定义标题栏

    Android中BaseActivity自定义标题栏

    这篇文章主要介绍了Android中BaseActivity自定义标题栏,非常实用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android获取手机SIM卡运营商信息的方法

    Android获取手机SIM卡运营商信息的方法

    这篇文章主要介绍了Android获取手机SIM卡运营商信息的方法,可获得手机的型号、运营商信息及系统版本等,需要的朋友可以参考下
    2014-09-09
  • Android实现网络多线程断点续传下载实例

    Android实现网络多线程断点续传下载实例

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • 基于Android的英文词典的实现方法

    基于Android的英文词典的实现方法

    这篇文章主要为大家详细介绍了基于Android的英文词典的实现方法
    2016-05-05
  • WebView设置WebViewClient的方法

    WebView设置WebViewClient的方法

    这篇文章主要介绍了 WebView设置WebViewClient的方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Android实现简单画图画板

    Android实现简单画图画板

    这篇文章主要为大家详细介绍了Android实现简单画图画板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 浅析Android的启动原理

    浅析Android的启动原理

    当谈到Android启动原理时,我们进入了Android操作系统的核心,理解Android系统启动的原理对于开发者来说非常重要,因为这有助于优化应用程序性能并提供更好的用户体验,本文给大家讲讲Android启动原理,需要的朋友可以参考下
    2023-10-10
  • Android 使用Intent传递数据的实现思路与代码

    Android 使用Intent传递数据的实现思路与代码

    Intent是Android中一个非常重要的概念,跟这个词的本意(意图,目的)一样,这个类在Android中的作用就是要调用某个组建去做某一件事,接下来详细介绍,感兴趣的朋友可以参考下
    2013-01-01
  • Android实现雅虎新闻摘要加载视差动画效果

    Android实现雅虎新闻摘要加载视差动画效果

    这篇文章主要介绍了Android实现雅虎新闻摘要加载视差动画效果,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Android基于google Zxing实现二维码的生成

    Android基于google Zxing实现二维码的生成

    这篇文章主要介绍了Android基于google Zxing实现二维码的生成的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论