這篇文章主要介紹了React-Native之Android權限申請的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、雅安服務器托管、營銷軟件、網(wǎng)站建設、嘉陵網(wǎng)站維護、網(wǎng)站推廣。
為什么Android要申請權限
簡單說下在Android6.0及6.0以上一些google認為涉及“危險和用戶隱私”的一些權限不僅要做清單文件(android/app/src/AndroidMainfest.xml)里面申請,還有單獨調(diào)用api,去讓用戶選擇是否同意你申請這個權限。
例如:你想要你的app有讀寫手機外置內(nèi)存卡權限,那么你需要在清單文件里面加下面兩行看字母應該懂的吧。但如果你的(android/app/build.gradle)里的 android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23你需要動態(tài)去申請權限,我發(fā)現(xiàn)react-native init app里面的targetSdkVersion = 22這個,,,巧妙的躲過了,但有些手機系統(tǒng)是6.0或以上的手機targetSdkVersion 22是獲取不到有些權限的,至少我知道的樂視就是無法逃脫,其他手機應該也有,而且這是一個android的安全機制,現(xiàn)在開發(fā)的app都應該盡量去遵守。
不多解釋了想了解可以search一下
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
效果
前提
(android/app/src/AndroidMainfest.xml) targetSdkVersion 改到 23或以上 ,為什么要改????看上面
開始
React-Native里面有PermissionsAndroid去動態(tài)申請權限,再說一句,動態(tài)申請同意一次就可以下次調(diào)用申請它不會再提醒用戶選擇了,如果拒絕了,可以再次申請,且在申請錢彈一個Dialog這個是手機系統(tǒng)的,我們只能提供一些解釋, 下面用三個權限來做解釋其實死是個 。
在低于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型數(shù)組 //就舉一個例子 記得加上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參數(shù)是可選的,其結構為包含title和message)的對象。 * 此方法會和系統(tǒng)協(xié)商,是彈出系統(tǒng)內(nèi)置的權限申請對話框, * 還是顯示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點了再不睡,我就要猝死了,其實運行一下就知道什么意思了
感謝你能夠認真閱讀完這篇文章,希望小編分享的“React-Native之Android權限申請的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!
網(wǎng)站名稱:React-Native之Android權限申請的示例分析
鏈接地址:http://bm7419.com/article2/jjesoc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站維護、軟件開發(fā)、搜索引擎優(yōu)化、小程序開發(fā)、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)