请选择 进入手机版 | 继续访问电脑版

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

[复制链接]
查看110 | 回复22 | 2021-9-14 07:08:15 | 显示全部楼层 |阅读模式

媒介

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

一、申请单个权限

起首 ,我们必要 定义一个launcher:

  1. ActivityResultLauncher<String> launcher = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
  2. result -> {
  3. if (result.equals(true)) {
  4. //权限获取到之后的动作
  5. } else {
  6. //权限没有获取到的动作
  7. }
  8. });
复制代码

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

  1. button.setOnClickListener(view -> {
  2. launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
  3. });
复制代码

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

二、获取多个权限

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

  1. ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(),
  2. result -> {
  3. if (result.get(Manifest.permission.CAMERA) != null
  4. && result.get(Manifest.permission.READ_EXTERNAL_STORAGE) != null) {
  5. if (Objects.requireNonNull(result.get(Manifest.permission.CAMERA)).equals(true)
  6. && Objects.requireNonNull(result.get(Manifest.permission.READ_EXTERNAL_STORAGE)).equals(true)) {
  7. //权限全部获取到之后的动作
  8. } else {
  9. //有权限没有获取到的动作
  10. }
  11. }
  12. });
复制代码

和单个权限不同的是,多个权限传入的方法是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方法:

  1. launcher.launch(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE})
复制代码

三、总结

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

到此这篇关于Android registerForActivityResult动态申请权限案例详解的文章就先容 到这了,更多相干 Android registerForActivityResult动态申请权限内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 东未红 | 2021-9-14 09:08:28 | 显示全部楼层
哥回复的不是帖子,是寂寞!
回复

使用道具 举报

avatar 一叶知秋117 | 2021-9-14 13:28:52 | 显示全部楼层
这一年啥事没干,光研究admin楼主的帖子了!
回复

使用道具 举报

avatar Deville | 2021-9-21 22:33:28 | 显示全部楼层
今天过得很不爽!
回复

使用道具 举报

avatar 123457732 | 2021-9-22 01:37:56 | 显示全部楼层
admin楼主,您忘记吃药了吧?
回复

使用道具 举报

avatar 无人岛屿颈 | 2021-9-24 20:05:37 | 显示全部楼层
看帖、回帖、拿分、走人
回复

使用道具 举报

avatar 北右酝 | 2021-10-5 19:50:19 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar 浪漫无边际缺 | 2021-10-5 22:20:06 | 显示全部楼层
看帖不回帖都是耍流氓!
回复

使用道具 举报

avatar 123457148 | 2021-10-5 23:04:12 | 显示全部楼层
太邪乎了吧?
回复

使用道具 举报

avatar 乐态思 | 2021-10-6 00:21:16 | 显示全部楼层
兰州烧饼,鉴定完毕!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则