React Native 模块之 PermissionsAndroid 权限检测与请求应用详解

阅读 1393
收藏 26
2016-09-28
原文链接:www.lcode.org

尊重版权,未经授权不得转载

本文来自:江清清的技术专栏(www.lcode.org)

(一)前言

Android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西,而且一般用户安装的时候很少会去仔细看权限列表,更不会去深入了解这些权限可能带来的相关危害。所以在Android 6.0 Marshmallow版本之后,系统不会在软件安装的时候就赋予该app所有其申请的权限,对于一些危险级别的权限,app需要在运行时一个一个询问用户授予权限。

刚创建的React Native交流九群:536404410,欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送!

PermissionsAndroid提供Android M的新权限模型。在SDK版本23之前的设备中,在manifest中声明的权限会自动获取到,所以我们调用checkPermission和requestPermission方法会自动返回true值。如果之前应用运行的时候用户关闭权限提醒框,操作系统会弹出一个提醒框。当我们有需要获取权限的时候,只需要弹出权限获取提醒让用户进行操作选择即可。该模块一个简单的实例如下:

async function requestCameraPermission() {
  try {
    const granted = await AndroidPermissions.requestPermission(
      AndroidPermissions.PERMISSIONS.CAMERA,
      {
        'title': 'Cool Photo App Camera Permission',
        'message': 'Cool Photo App needs access to your camera ' +
                   'so you can take awesome pictures.'
      }
    )
    if (granted) {
      console.log("You can use the camera")
    } else {
      console.log("Camera permission denied")
    }
  } catch (err) {
    console.warn(err)
  }
}
(二)属性与方法

         2.1.checkPermission(permission)  该方法返回一个Promise对象,其中resolve值返回一个boolean值用来表示权限是否已经被授权。

         2.2.requestPermission(permission,rationale?)   该方法返回一个Promise对象,其中resolve值返回一个boolean值,用来表示权限授权请求是否允许还是拒绝。第二个rationale参数代表请求授权的弹框确认

(三)需要处理的一些危险权限

        在Android权限模块中,权限比较多,但是一些需要我们这样的授权处理,一些是不需要,这边我列举一下官方说明需要处理的一些危险权限信息。

      READ_CALENDAR: 'android.permission.READ_CALENDAR',
      WRITE_CALENDAR: 'android.permission.WRITE_CALENDAR',
      CAMERA: 'android.permission.CAMERA',
      READ_CONTACTS: 'android.permission.READ_CONTACTS',
      WRITE_CONTACTS: 'android.permission.WRITE_CONTACTS',
      GET_ACCOUNTS:  'android.permission.GET_ACCOUNTS',
      ACCESS_FINE_LOCATION: 'android.permission.ACCESS_FINE_LOCATION',
      ACCESS_COARSE_LOCATION: 'android.permission.ACCESS_COARSE_LOCATION',
      RECORD_AUDIO: 'android.permission.RECORD_AUDIO',
      READ_PHONE_STATE: 'android.permission.READ_PHONE_STATE',
      CALL_PHONE: 'android.permission.CALL_PHONE',
      READ_CALL_LOG: 'android.permission.READ_CALL_LOG',
      WRITE_CALL_LOG: 'android.permission.WRITE_CALL_LOG',
      ADD_VOICEMAIL: 'com.android.voicemail.permission.ADD_VOICEMAIL',
      USE_SIP: 'android.permission.USE_SIP',
      PROCESS_OUTGOING_CALLS: 'android.permission.PROCESS_OUTGOING_CALLS',
      BODY_SENSORS:  'android.permission.BODY_SENSORS',
      SEND_SMS: 'android.permission.SEND_SMS',
      RECEIVE_SMS: 'android.permission.RECEIVE_SMS',
      READ_SMS: 'android.permission.READ_SMS',
      RECEIVE_WAP_PUSH: 'android.permission.RECEIVE_WAP_PUSH',
      RECEIVE_MMS: 'android.permission.RECEIVE_MMS',
      READ_EXTERNAL_STORAGE: 'android.permission.READ_EXTERNAL_STORAGE',
      WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE',
(四)实例演示

          上面只是对于PermissionsAndroid模块的一些基本介绍,下面我们采用具体实例进行演示一下效果,特别声明该功能只针对SDK Version >=23的才有用,也就是说最低测试版本Android M系统,具体代码如下:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  PermissionsAndroid,
  TextInput,
  TouchableWithoutFeedback
} from 'react-native';

class PermissionDemo extends Component {
  constructor(props, context) {
    super(props, context);
    this.state = {
       permission: PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
       hasPermission: 'Not Checked',
      };
  }
  render() {
    return (
      
        Permission Name:
        
        
          
            Check Permission
          
        
        Permission Status: {this.state.hasPermission}
        
          
            Request Permission
          
        
      
    );
  }

  _updateText = (event: Object) => {
    this.setState({
      permission: event.nativeEvent.text,
    });
  }

  _checkPermission = async () => {
    let result = await PermissionsAndroid.checkPermission(this.state.permission);
    this.setState({
      hasPermission: (result ? '授权成功' : '授权失败') + ' for ' +
        this.state.permission,
    });
  }

  _requestPermission = async () => {
    let result = await PermissionsAndroid.requestPermission(
      this.state.permission,
      {
        title: '权限请求',
        message:
          '该应用需要如下权限 ' + this.state.permission +
          ' 请授权!'
      },
    );
    this.setState({
      hasPermission: (result ? '授权成功' : '授权失败') + ' for ' +
        this.state.permission,
    });
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'white',
  },
  singleLine: {
    fontSize: 16,
    padding: 4,
  },
  text: {
    margin: 10,
  },
  touchable: {
    color: '#007AFF',
  },
});

AppRegistry.registerComponent('PermissionDemo', () => PermissionDemo);
(五)最后总结

今天我们主要讲解了PermissionsAndroid权限处理模块,该使用比较简单,就是一些注意点平时开发中多多注意一下就行了。

刚创建的React Native交流九群:536404410,欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送!

关注我的订阅号(codedev123),每天推送分享移动开发技术(Android/iOS),React Native技术文章,项目管理,程序猿日常点滴以及精品技术资讯文章(欢迎关注,精彩第一时间推送)。

查看图片

关注我的微博,可以获得更多精彩内容

评论