天天看點

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項目

責任編輯: