NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

这篇博客介绍了如何在React Native(RN)项目中处理iOS和Android的相机、相册、日历和定位权限。Android端在用户拒绝或选择不再提示时会持续弹窗,而iOS只会弹出一次。文章提供了Android的PermissionsAndroid文档链接,并给出了Android端的RN代码示例,同时提到了iOS端的权限处理和桥接文件的使用方法。
摘要由CSDN通过智能技术生成

RN工程做个权限列表开关
相机
相册
日历
定位

两端获取权限的区别

android 调用申请权限,系统会呈现两个还是三个系统弹窗, 直到你同意或拒绝后,选择不在提示,
iOS端,调用申请权限,系统弹窗仅会弹出一次, 该次就决定了你的权限策略, 此后再调用 申请权限API 均无系统弹窗了
区别就是:
android,会一直弹出, 直到你同意或不再提示
iOS仅弹出一次,你此次必须决定授权与否, 此次过后不再弹窗,(除非重装)

所以,针对表现形式不同,逻辑也要做不同处理 (如果要做到双端一致的话)
Android端,选择不再提示后, 帮助用户跳转系统设置,交给用户自己处理
iOS端, 申请过一次后, 下次用户再进行设置 ,就应该帮用户直接跳转系统设置

Android端

PermissionsAndroid就足够了
[PermissionsAndroid文档]
(https://reactnative.cn/docs/0.68/permissionsandroid)
Android 权限管理

android端对各种权限的状态获取 / 权限申请, 由于有PermissionsAndroid的关系, 可以直接在RN端处理开发
贴一下RN端处理代码, 仅关注 !isIOS逻辑分支(即Android端)内的即可, else分支内为iOS桥接代码,后面再贴出来.

/*************************** 1 ***************************/

  /**
   * 检查相册权限状态
   */
  static checkReadWPermission() {
   
    return new Promise(async (resolv, reject) => {
   
      if (!isIOS) {
   
        try {
   
          let check_r = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE)
          let check_w = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE)
          if (check_r || check_w) {
   
            resolv()
          } else {
   
            reject()
          }
        } catch (e) {
   
          reject()
        }
      } else {
   
        let res = NativeModules.GeneralModule.checkPhotoAlbumState();
        if (res === "yes") {
   
          resolv()
        } else {
   
          reject()
        }
      }
    })
  }

  /**
   * 申请相册权限(获取读写权限)
   */
  static requestReadWPermission() {
   
    return new Promise((resolve, reject) => {
   
      if (!isIOS) {
   
        PermissionsAndroid.requestMultiple([
          PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
          PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
        ]).then(granted => {
   
          if (
            granted["android.permission.READ_EXTERNAL_STORAGE"] === PermissionsAndroid.RESULTS.GRANTED ||
            granted["android.permission.WRITE_EXTERNAL_STORAGE"] === PermissionsAndroid.RESULTS.GRANTED
          ) {
   
            rlog('你已获取了相册权限');
            resolve("yes");
          }
          if (
            granted["android.permission.READ_EXTERNAL_STORAGE"] === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN ||
            granted["android.permission.WRITE_EXTERNAL_STORAGE"] === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN
          ) {
   
            rlog('不再提示相册权限');
            resolve("naver");
          } else {
   
            rlog('获取相册权限失败');
            reject();
          }
        })
          .catch(err => {
   
            reject();
          });
      }
      // ios
      else {
   
        let res = NativeModules.GeneralModule.getPhotoAlbumState();
        if (res === 'yes') {
   
          rlog('你已获取了相册权限');
          resolve()
        } else {
   
          rlog('获取相册权限失败');
          reject()
        }
      }
    });
  }


  /**
   * 检查相机权限状态
   */
  static checkCameraPermission() {
   
    return new Promise(async (resolv, reject) => {
   
      if (!isIOS) {
   
        try {
   
          let check = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.CAMERA);
          check ? resolv() : reject()
        } catch (e) {
   
          reject()
        }
      } else {
   
        let res = NativeModules.GeneralModule.checkCameraState();
        if (res === "yes") {
   
          resolv()
        } else {
   
          reject(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值