国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

React-Native之Android(6.0及以上)權限申請詳解

2019-10-22 18:23:03
字體:
來源:轉載
供稿:網友

為什么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一下

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

效果

ReactNative,Android6權限,Android6.0

 

 

ReactNative,Android6權限,Android6.0

 

 
ReactNative,Android6權限,Android6.0 

 

前提

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

開始

React-Native里面有PermissionsAndroid去動態申請權限,再說一句,動態申請同意一次就可以下次調用申請它不會再提醒用戶選擇了,如果拒絕了,可以再次申請,且在申請錢彈一個Dialog這個是手機系統的,我們只能提供一些解釋, 下面用三個權限來做解釋其實死是個 。

在低于Android 6.0的設備上,權限只要寫在AndroidManifest.xml里就會自動獲得,此情形下check和request 方法將始終返回true。

async function requestCameraPermission() { try { const granted = await PermissionsAndroid.request(  PermissionsAndroid.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 === PermissionsAndroid.RESULTS.GRANTED) {  console.log("You can use the camera") } else {  console.log("Camera permission denied") } } catch (err) { console.warn(err) }}

常用

check(permission)
返回一個promise,最終值為用戶是否授權過的布爾值。

request(permission, rationale?)
彈出提示框向用戶請求某項權限。返回一個promise,最終值為用戶是否同意了權限申請的布爾值。

requestMultiple(permissions)
在一個彈出框中向用戶請求多個權限。返回值為一個object,key為各權限名稱,對應值為用戶授權與否。

第一步

1. 在 android/app/src/AndroidMainfest.xml 添加

<!--獲取讀寫外置存儲權限--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--獲取相機權限--><uses-permission android:name="android.permission.CAMERA"/><!--獲取地址相關權限--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

第二步

//添加 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異步async requestReadPermission() {  try {   //返回string類型   const granted = await PermissionsAndroid.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類型   const granted = 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())  } }//請求多個async requestMultiplePermission() {  try {   const permissions = [    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,    PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,    PermissionsAndroid.PERMISSIONS.CAMERA   ]   //返回得是對象類型   const granteds = await PermissionsAndroid.requestMultiple(permissions)   var data = "是否同意地址權限: "   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 default class PermissionAndroidView extends Component { render() {  return (   <View style={styles.container}>    <TouchableOpacity style={styles.button_view}     onPress={this.requestReadPermission.bind(this)}>     <Text style={styles.button_text}>申請讀寫權限</Text>    </TouchableOpacity>    <TouchableOpacity style={styles.button_view}     onPress={this.requestCarmeraPermission.bind(this)}>     <Text style={styles.button_text}>申請相機權限</Text>    </TouchableOpacity>    <TouchableOpacity style={styles.button_view}     onPress={this.requestLocationPermission.bind(this)}>     <Text style={styles.button_text}>申請訪問地址權限</Text>    </TouchableOpacity>    <TouchableOpacity style={styles.button_view}         onPress={this.checkPermission.bind(this)}>     <Text style={styles.button_text}>查詢是否獲取了讀寫權限</Text>    </TouchableOpacity>    <TouchableOpacity style={styles.button_view}         onPress={this.requestMultiplePermission.bind(this)}>     <Text style={styles.button_text}>一次申請所以權限</Text>    </TouchableOpacity>   </View>  ) } show(data) {  ToastAndroid.show(data,ToastAndroid.SHORT) } /* * 彈出提示框向用戶請求某項權限。返回一個promise,最終值為用戶是否同意了權限申請的布爾值。 * 其中rationale參數是可選的,其結構為包含title和message)的對象。 * 此方法會和系統協商,是彈出系統內置的權限申請對話框, * 還是顯示rationale中的信息以向用戶進行解釋。 * */ async requestReadPermission() {  try {   //返回string類型   const granted = await PermissionsAndroid.request(    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,    {     //第一次請求拒絕后提示用戶你為什么要這個權限     'title': '我要讀寫權限',     'message': '沒權限我不能工作,同意就好了'    }   )   if (granted === PermissionsAndroid.RESULTS.GRANTED) {    this.show("你已獲取了讀寫權限")   } else {    this.show("獲取讀寫權限失敗")   }  } catch (err) {   this.show(err.toString())  } } async requestCarmeraPermission() {  try {   const granted = await PermissionsAndroid.request(    PermissionsAndroid.PERMISSIONS.CAMERA,    {     //第一次請求拒絕后提示用戶你為什么要這個權限     'title': '我要相機權限',     'message': '沒權限我不能工作,同意就好了'    }   )   if (granted === PermissionsAndroid.RESULTS.GRANTED) {    this.show("你已獲取了相機權限")   } else {    this.show("獲取相機失敗")   }  } catch (err) {   this.show(err.toString())  } } async requestLocationPermission() {  try {   const granted = await PermissionsAndroid.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類型   const granted = 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())  } } async requestMultiplePermission() {  try {   const permissions = [    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,    PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,    PermissionsAndroid.PERMISSIONS.CAMERA   ]   //返回得是對象類型   const granteds = await PermissionsAndroid.requestMultiple(permissions)   var data = "是否同意地址權限: "   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())  } }}const styles = 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點了再不睡,我就要猝死了,其實運行一下就知道什么意思了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浠水县| 清原| 长乐市| 黎城县| 黄骅市| 甘南县| 万安县| 霸州市| 扬中市| 南充市| 东莞市| 札达县| 双辽市| 淮南市| 宝坻区| 洛南县| 台江县| 平顶山市| 内黄县| 宝应县| 柯坪县| 莱州市| 集贤县| 江安县| 精河县| 杭州市| 陆河县| 延长县| 新闻| 边坝县| 当阳市| 年辖:市辖区| 和顺县| 红安县| 平原县| 吴江市| 陇南市| 南康市| 长宁区| 伊宁县| 英超|