天天看点

android申请相机权限8.1,React-Native之Android(6.0及以上)权限申请

原标题:React-Native之Android(6.0及以上)权限申请

android申请相机权限8.1,React-Native之Android(6.0及以上)权限申请

为什么Android要申请权限

简单说下在Android6.0及6.0以上一些google认为涉及“危险和用户隐私”的一些权限不仅要做清单文件(android/app/src/AndroidMainfest.xml)里面申请,还有单独调用api,去让用户选择是否同意你申请这个权限。

例如:你想要你的app有读写手机外置内存卡权限,那么你需要在清单文件里面加下面两行看字母应该懂的吧。但如果你的(android/app/build.gradle)里的 android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23你需要动态去申请权限,我发现react-native init app里面的targetSdkVersion = 22这个,,,巧妙的躲过了,但有些手机系统是6.0或以上的手机targetSdkVersion 22是获取不到有些权限的,至少我知道的乐视就是无法逃脱,其他手机应该也有,而且这是一个android的安全机制,现在开发的app都应该尽量去遵守。

不多解释了想了解可以search一下

效果

android申请相机权限8.1,React-Native之Android(6.0及以上)权限申请
android申请相机权限8.1,React-Native之Android(6.0及以上)权限申请
android申请相机权限8.1,React-Native之Android(6.0及以上)权限申请

前提

(android/app/src/AndroidMainfest.xml) targetSdkVersion 改到 23或以上 ,为什么要改????看上面开始

React-Native里面有PermissionsAndroid去动态申请权限,再说一句,动态申请同意一次就可以下次调用申请它不会再提醒用户选择了,如果拒绝了,可以再次申请,且在申请钱弹一个Dialog这个是手机系统的,我们只能提供一些解释,下面用三个权限来做解释其实死是个。1. 在 android/app/src/AndroidMainfest.xml 添加

第二步

//添加 PermissionsAndroid RN自带的import { PermissionsAndroid }

from

'react-native'

第三步

//给你们介绍下怎么用它的方法

//返回 Promise类型 里面是用户是否授权的布尔值

1.PermissionsAndroid.check(permission)

//permission是String型

//返回String类型

'granted': 同意了

'denied': 拒绝了

'never_ask_again': 永久性拒绝下次再请求用户也看不到了,尴不尴尬

2.PermissionsAndroid.request(permission, rationale?)

//permission是String型,rationale对象

//返回一个对象

3.PermissionsAndroid.requestMultiple(permissions)

//permissions为String型数组

//就举一个例子 记得加上async异步

asyncrequestReadPermission() {

try{

//返回string类型

constgranted =

awaitPermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, {

//第一次请求拒绝后提示用户你为什么要这个权限

'title':

'我要读写权限',

'message':

'没权限我不能工作,同意就好了'} )

if(granted === PermissionsAndroid.RESULTS.GRANTED) {

this.show(

"你已获取了读写权限") }

else{

this.show(

"获取读写权限失败") } }

catch(err) {

this.show(err.toString()) } }

//核实checkPermission() {

try{

//返回Promise类型

constgranted = PermissionsAndroid.check( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE ) granted.then((data)=>{

this.show(

"是否获取读写权限"+data) }).

catch((err)=>{

this.show(err.toString()) }) }

catch(err) {

this.show(err.toString()) } }

//请求多个

asyncrequestMultiplePermission() {

try{

constpermissions = [ PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, PermissionsAndroid.PERMISSIONS.CAMERA ]

//返回得是对象类型

constgranteds =

awaitPermissionsAndroid.requestMultiple(permissions)

vardata =

"是否同意地址权限: "

if(granteds[

"android.permission.ACCESS_FINE_LOCATION"] ===

"granted") { data = data +

"是\n"}

else{ data = data +

"否\n"} data = data+

"是否同意相机权限: "

if(granteds[

"android.permission.CAMERA"] ===

"granted") { data = data +

"是\n"}

else{ data = data +

"否\n"} data = data+

"是否同意存储权限: "

if(granteds[

"android.permission.WRITE_EXTERNAL_STORAGE"] ===

"granted") { data = data +

"是\n"}

else{ data = data +

"否\n"}

this.show(data) }

catch(err) {

this.show(err.toString()) } }

完整代码import React,{Component}

from

'react'import { StyleSheet, View, Text, TouchableOpacity, ToastAndroid, PermissionsAndroid, }

from

'react-native'export

defaultclass PermissionAndroidView extends Component { render() {

return(

this.requestReadPermission.bind(

this)}> 申请读写权限

this.requestCarmeraPermission.bind(

this)}> 申请相机权限

this.requestLocationPermission.bind(

this)}> 申请访问地址权限

this.checkPermission.bind(

this)}> 查询是否获取了读写权限

this.requestMultiplePermission.bind(

this)}> 一次申请所以权限

) } show(data) { ToastAndroid.show(data,ToastAndroid.SHORT) }

asyncrequestReadPermission() {

try{

//返回string类型

constgranted =

awaitPermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, {

//第一次请求拒绝后提示用户你为什么要这个权限

'title':

'我要读写权限',

'message':

'没权限我不能工作,同意就好了'} )

if(granted === PermissionsAndroid.RESULTS.GRANTED) {

this.show(

"你已获取了读写权限") }

else{

this.show(

"获取读写权限失败") } }

catch(err) {

this.show(err.toString()) } }

asyncrequestCarmeraPermission() {

try{

constgranted =

awaitPermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.CAMERA, {

//第一次请求拒绝后提示用户你为什么要这个权限

'title':

'我要相机权限',

'message':

'没权限我不能工作,同意就好了'} )

if(granted === PermissionsAndroid.RESULTS.GRANTED) {

this.show(

"你已获取了相机权限") }

else{

this.show(

"获取相机失败") } }

catch(err) {

this.show(err.toString()) } }

asyncrequestLocationPermission() {

try{

constgranted =

awaitPermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, {

//第一次请求拒绝后提示用户你为什么要这个权限

'title':

'我要地址查询权限',

'message':

'没权限我不能工作,同意就好了'} )

if(granted === PermissionsAndroid.RESULTS.GRANTED) {

this.show(

"你已获取了地址查询权限") }

else{

this.show(

"获取地址查询失败") } }

catch(err) {

this.show(err.toString()) } } checkPermission() {

try{

//返回Promise类型

constgranted = PermissionsAndroid.check( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE ) granted.then((data)=>{

this.show(

"是否获取读写权限"+data) }).

catch((err)=>{

this.show(err.toString()) }) }

catch(err) {

this.show(err.toString()) } }

asyncrequestMultiplePermission() {

try{

constpermissions = [ PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, PermissionsAndroid.PERMISSIONS.CAMERA ]

//返回得是对象类型

constgranteds =

awaitPermissionsAndroid.requestMultiple(permissions)

vardata =

"是否同意地址权限: "

if(granteds[

"android.permission.ACCESS_FINE_LOCATION"] ===

"granted") { data = data +

"是\n"}

else{ data = data +

"否\n"} data = data+

"是否同意相机权限: "

if(granteds[

"android.permission.CAMERA"] ===

"granted") { data = data +

"是\n"}

else{ data = data +

"否\n"} data = data+

"是否同意存储权限: "

if(granteds[

"android.permission.WRITE_EXTERNAL_STORAGE"] ===

"granted") { data = data +

"是\n"}

else{ data = data +

"否\n"}

this.show(data) }

catch(err) {

this.show(err.toString()) } } }

conststyles = StyleSheet.create({ container: { flex:

1, padding:

10, }, button_view: { margin:

4, borderRadius:

4, backgroundColor:

'#8d4dfc', alignItems:

'center', }, button_text: { padding:

6, fontSize:

16, fontWeight:

'600'} })

// 12点了再不睡,我就要猝死了,其实运行一下就知道什么意思了没时间解释了,直接可以运行看效果解释的也很清楚 React Native项目

责任编辑: