Android registerForActivityResult动态申请权限案例详解
作者:Karry学长 时间:2021-10-05 17:40:42
前言
这几天在做一个小工具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动态申请权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://blog.csdn.net/weixin_50285953/article/details/120122234
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java分布式服务框架Dubbo介绍
![](https://img.aspxhome.com/file/2023/1/68701_0s.png)
c#扩展datatable转json示例
Java编程基本概念
详细介绍idea如何设置类头注释和方法注释(图文)
![](https://img.aspxhome.com/file/2023/8/77458_0s.jpg)
Java自定义标签用法实例分析
c# 代码调试技巧和如何远程调试
![](https://img.aspxhome.com/file/2023/7/87017_0s.png)
详解Java多线程编程中线程的启动、中断或终止操作
四步轻松搞定java web每天定时执行任务
Lombok为啥这么牛逼?SpringBoot和IDEA官方都要支持它
![](https://img.aspxhome.com/file/2023/7/64497_0s.png)
Spring MVC请求参数与响应结果全局加密和解密详解
![](https://img.aspxhome.com/file/2023/2/69352_0s.png)
详解hbase与hive数据同步
![](https://img.aspxhome.com/file/2023/3/132013_0s.png)
c# 如何实现图片压缩
Java线程的生命周期的详解
TKmybatis的框架介绍和原理解析
Java实战员工绩效管理系统的实现流程
![](https://img.aspxhome.com/file/2023/1/81941_0s.jpg)
java多线程中的异常处理机制简析
VS2010+Opencv+MFC读取图像和视频显示在Picture控件
![](https://img.aspxhome.com/file/2023/2/133262_0s.png)
C++编写实现图书管理系统
![](https://img.aspxhome.com/file/2023/6/127526_0s.jpg)
Android编程获取GPS数据的方法详解
![](https://img.aspxhome.com/file/2023/1/88721_0s.jpg)