原标題: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/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項目
責任編輯: