赞
踩
对于我们移动端开发,尤其是安卓开发来说,手机权限的动态获取是几乎每个APP必备的。
下面记录一下,在react native 中如何实现。
首先介绍一下,在react native中,对于权限的操作,需要用到一个组件就是PermissionAndroid。
具体实现场景如下:权限的获取,放在首页。在首页进行一次统一的check与request。
- //获取所需的权限
- requestPermissions = async () => {
-
- try {
-
- const permissions = [
- PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
- PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
-
- PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
-
- PermissionsAndroid.PERMISSIONS.CAMERA];
-
- const granted = await PermissionsAndroid.requestMultiple(permissions);
-
- // if (granted['android.permission.WRITE_EXTERNAL_STORAGE'] === 'granted') {} else {}
- console.log("------>打印返回的权限授权值" + permission + "------>" + granted)
-
- return granted;
-
- } catch (err) {
-
- // this._show(err.toString());
-
- return null;
-
- }
-
- };

到此就完成了统一的权限请求。但是要注意引入相应的包
import { PermissionsAndroid } from 'react-native';
那么对于单一的权限的检查与再次申请还有用户授权后的相对应的处理要如何去做,代码如下:
- componentDidMount() {
- this.checkPermissionCarmera();
- this.checkPermissionRead();
- this.checkPermissionWrite();
- this.getDataFromSever();
- }
-
- //检查是否获取定位权限
- checkPermissionCarmera() {
- try {
- //返回Promise类型
- const granted = PermissionsAndroid.check(
- PermissionsAndroid.PERMISSIONS.CAMERA
- )
- // console.log("此时的granted的值为----"+granted.data)
- granted.then((data) => {
- // console.log("是否获取定位权限----" + data)
- if (data == false) {
- // console.log("未获得权限 请求权限----" + data)
- this.requestPermissionCarmera();
- }
- }).catch((err) => {
- Toast.info(err.toString())
- })
- } catch (err) {
- Toast.info(err.toString())
- }
- }
-
- //请求定位权限
- requestPermissionCarmera = async () => {
- // PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION)
- try {
- //返回string类型
- const granted = await PermissionsAndroid.request(
- PermissionsAndroid.PERMISSIONS.CAMERA,
- {
- //第一次请求拒绝后提示用户你为什么要这个权限
- 'title': '我要定位权限',
- 'message': '没权限我不能工作,同意就好了'
- }
- )
- if (granted === PermissionsAndroid.RESULTS.GRANTED) {
- console.log("-----用户已授权")
- } else {
- Toast.info("请先开启相机权限")
- this.backButtonPress();
-
- }
- } catch (err) {
- console.log("-----出现错误")
- }
- }
-
- //检查是否获取读取权限
- checkPermissionRead() {
- try {
- //返回Promise类型
- const granted = PermissionsAndroid.check(
- PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE
- )
-
- granted.then((data) => {
-
- if (data == false) {
-
- this.requestPermissionRead();
- }
- }).catch((err) => {
- Toast.info(err.toString())
- })
- } catch (err) {
- Toast.info(err.toString())
- }
- }
-
- //请求读取权限
- requestPermissionRead = async () => {
- // PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION)
- try {
- //返回string类型
- const granted = await PermissionsAndroid.request(
- PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
- {
- //第一次请求拒绝后提示用户你为什么要这个权限
- 'title': '我要读取权限',
- 'message': '没权限我不能工作,同意就好了'
- }
- )
- if (granted === PermissionsAndroid.RESULTS.GRANTED) {
- console.log("-----用户已授权")
- } else {
- Toast.info("请先开启读取权限")
- this.backButtonPress();
-
- }
- } catch (err) {
- console.log("-----出现错误")
- }
- }
-
- //检查是否获取写入权限
- checkPermissionWrite() {
- try {
- //返回Promise类型
- const granted = PermissionsAndroid.check(
- PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
- )
-
- granted.then((data) => {
-
- if (data == false) {
-
- this.requestPermissionWrite();
- }
- }).catch((err) => {
- Toast.info(err.toString())
- })
- } catch (err) {
- Toast.info(err.toString())
- }
- }
-
- //请求写入权限
- requestPermissionWrite = async () => {
- // PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION)
- try {
- //返回string类型
- const granted = await PermissionsAndroid.request(
- PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
- {
- //第一次请求拒绝后提示用户你为什么要这个权限
- 'title': '我要写入权限',
- 'message': '没权限我不能工作,同意就好了'
- }
- )
- if (granted === PermissionsAndroid.RESULTS.GRANTED) {
- console.log("-----用户已授权")
- } else {
- Toast.info("请先开启写入权限")
- this.backButtonPress();
-
- }
- } catch (err) {
- console.log("-----出现错误")
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。