文章

Android权限申请-PermissionsAndroid

Android权限申请-PermissionsAndroid

Android权限申请-PermissionsAndroid

Android权限申请-PermissionsAndroid

RN权限申请

最基础的一步,先在android的AndroidManifest.xml文件中添加权限声明\ 就像这样。

1692842640132-a57d5c3d-9d98-464b-963f-cd6adda0760d.png

然后使用reactNative自带的权限管理API,使用比较简单。

PermissionsAndroid和它的三个方法

这个API主要使用的就是三个方法,用于检查是否拥有权限的**check**方法,请求权限的**request**方法,请求多个权限的**requestMultiple**方法,

  • check(permission):检查传入的权限是否经过授权,返回的是一个promise,解析为布尔值。
  • request(permission,[rationale]):传入需要请求的权限,第二个参数rationale对象可以看官方文档,尾部链接,这是个可选项,
  • requestMultiple(permission): 传入一个包含多个权限的数组。

请求权限返回的结果如下:

  • GRANTED: ‘granted’, 表示用户已授权
  • DENIED: ‘denied’, 表示用户已拒绝
  • NEVER_ASK_AGAIN: ‘never_ask_again’,表示用户已拒绝,且不愿被再次询问。

从android 6.0以下的版本说起

据说 6.0 以下版本,权限写在AndroidManifest.xml文件里就好,这个时候权限都可以直接请求到,这个时候的check始终返回true,并且request请求始终返回PermissionsAndroid.RESULTS.GRANTED,\ 写法和下面六点零以上版本一样

android6.0以上版本

请求单个相机权限的标准案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
async requestCameraPermissions() {
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.CAMERA,
      {
        title: '申请相机权限',
        message: '不给权限不干活',
        buttonPositive: 'OK',
      },
    );
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      infoToast('已获取相机权限');
    } else {
      errorToast('获取权限失败');
    }
  } catch (err) {
    console.log(err);
  }
}

因为是请求权限是个异步过程,所以需要async和await关键字,然后判断granted是否等于PermissionsAndroid.RESULTS.GRANTED来判断是否请求成功,\ 然后再我的小米上运行:

1692842844150-7fba0b62-ed90-46a7-82af-90cfa452f556.png

然后就获取成功了

获取定位权限标准案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const granted = await PermissionsAndroid.request(
  PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
  {
    title: "获取定位权限",
    message: '允许“灰蚁军团”使用你的位置?',
    buttonPositive: "允许",
    buttonNegative: "不允许"
  }
)
// 允许
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  infoToast('已获取定位权限');
}
// 拒绝
else {
  errorToast('获取定位权限失败');
}

获取多个权限

和上文差不多,见下文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
async requestAllPermissions() {
  try {
    //申请多个权限,传入一个权限对象数组
    const granted = await PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.PROCESS_OUTGOING_CALLS,
      PermissionsAndroid.PERMISSIONS.CALL_PHONE,
      PermissionsAndroid.PERMISSIONS.USE_SIP,
    ]);
    if (
      granted['android.permission.CALL_PHONE'] ===
      PermissionsAndroid.RESULTS.GRANTED
    ) {
      console.log('CALL_PHONE 权限已获取');
    } 
    if (
      granted['android.permission.PROCESS_OUTGOING_CALLS'] ===
      PermissionsAndroid.RESULTS.GRANTED
    ) {
      console.log('PROCESS_OUTGOING_CALLS 权限已获取');
    } 
    if (
      granted['android.permission.USE_SIP'] ===
      PermissionsAndroid.RESULTS.GRANTED
    ) {
      console.log('USE_SIP 权限已获取');
    }
  } catch (err) {
    console.log(err);
  }
}

效果如下

1692842899980-059793ab-b575-457d-90a6-eed23f377bee.png

可以看到,确实获取了多个权限。\ 可以把请求权限的方法放在项目初次进入或者放在需要使用权限的地方

本文由作者按照 CC BY 4.0 进行授权