原生Android之(6.0及以上)权限申请
為什么Android的要申請(qǐng)權(quán)限
簡單說下在Android6.0及6.0以上一些谷歌認(rèn)為涉及“危險(xiǎn)和用戶隱私”的一些權(quán)限不僅要做清單文件(機(jī)器人/應(yīng)用/ SRC / AndroidMainfest.xml)里面申請(qǐng),還有單獨(dú)調(diào)用API,去讓用戶選擇是否同意你申請(qǐng)這個(gè)權(quán)限。
例如:你想要你的應(yīng)用程序有讀寫手機(jī)外置內(nèi)存卡權(quán)限,那么你需要在清單文件里面加下面兩行看字母應(yīng)該懂的吧但如果你的(機(jī)器人/應(yīng)用/的build.gradle)里的android {defaultConfig {targetSdkVersion 23}} targetSdkVersion> = 23你需要?jiǎng)討B(tài)去申請(qǐng)權(quán)限,我發(fā)現(xiàn)react-native init app里面的targetSdkVersion = 22這個(gè),,,巧妙的躲過了,但有些手機(jī)系統(tǒng)是6.0或以上的手機(jī)targetSdkVersion 22是獲取不到有些權(quán)限的,至少我知道的樂視就是無法逃脫,其他手機(jī)應(yīng)該也有,而且這是一個(gè)android的安全機(jī)制,現(xiàn)在開發(fā)的app都應(yīng)該盡量去遵守。 不多解釋了想了解可以搜索一下
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 復(fù)制代碼效果
前提
(android / app / src / AndroidMainfest.xml)targetSdkVersion改到23或以上,為什么要改????看上面 復(fù)制代碼開始
反應(yīng)母語里面有PermissionsAndroid去動(dòng)態(tài)申請(qǐng)權(quán)限,再說一句,動(dòng)態(tài)申請(qǐng)同意一次就可以下次調(diào)用申請(qǐng)它不會(huì)再提醒用戶選擇了,如果拒絕了,可以再次申請(qǐng),且在申請(qǐng)錢彈一個(gè)對(duì)話框這個(gè)是手機(jī)系統(tǒng)的,我們只能提供一些解釋,下面用三個(gè)權(quán)限來做解釋其實(shí)死是個(gè)。
第一步
1. 在 android/app/src/AndroidMainfest.xml 添加<!--獲取讀寫外置存儲(chǔ)權(quán)限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--獲取相機(jī)權(quán)限--> <uses-permission android:name="android.permission.CAMERA"/> <!--獲取地址相關(guān)權(quán)限--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>復(fù)制代碼第二步
//添加 PermissionsAndroid RN自帶的 import { PermissionsAndroid } from 'react-native' 復(fù)制代碼第三步
//給你們介紹下怎么用它的方法//返回 Promise類型 里面是用戶是否授權(quán)的布爾值 1. PermissionsAndroid.check(permission) //permission是String型//返回String類型 'granted': 同意了 'denied' : 拒絕了 'never_ask_again' : 永久性拒絕下次再請(qǐng)求用戶也看不到了,尷不尷尬 2. PermissionsAndroid.request(permission, rationale?) //permission是String型,rationale對(duì)象//返回一個(gè)對(duì)象 3. PermissionsAndroid.requestMultiple(permissions) //permissions為String型數(shù)組//就舉一個(gè)例子 記得加上async異步 async requestReadPermission() {try {//返回string類型const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,{//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限'title': '我要讀寫權(quán)限','message': '沒權(quán)限我不能工作,同意就好了'})if (granted === PermissionsAndroid.RESULTS.GRANTED) {this.show("你已獲取了讀寫權(quán)限")} else {this.show("獲取讀寫權(quán)限失敗")}} catch (err) {this.show(err.toString())}}//核實(shí) checkPermission() {try {//返回Promise類型const granted = PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE)granted.then((data)=>{this.show("是否獲取讀寫權(quán)限"+data)}).catch((err)=>{this.show(err.toString())})} catch (err) {this.show(err.toString())}}//請(qǐng)求多個(gè) async requestMultiplePermission() {try {const permissions = [PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,PermissionsAndroid.PERMISSIONS.CAMERA]//返回得是對(duì)象類型const granteds = await PermissionsAndroid.requestMultiple(permissions)var data = "是否同意地址權(quán)限: "if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {data = data + "是\n"} else {data = data + "否\n"}data = data+"是否同意相機(jī)權(quán)限: "if (granteds["android.permission.CAMERA"] === "granted") {data = data + "是\n"} else {data = data + "否\n"}data = data+"是否同意存儲(chǔ)權(quán)限: "if (granteds["android.permission.WRITE_EXTERNAL_STORAGE"] === "granted") {data = data + "是\n"} else {data = data + "否\n"}this.show(data)} catch (err) {this.show(err.toString())}} 復(fù)制代碼完整代碼
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}>申請(qǐng)讀寫權(quán)限</Text></TouchableOpacity><TouchableOpacity style={styles.button_view}onPress={this.requestCarmeraPermission.bind(this)}><Text style={styles.button_text}>申請(qǐng)相機(jī)權(quán)限</Text></TouchableOpacity><TouchableOpacity style={styles.button_view}onPress={this.requestLocationPermission.bind(this)}><Text style={styles.button_text}>申請(qǐng)?jiān)L問地址權(quán)限</Text></TouchableOpacity><TouchableOpacity style={styles.button_view}onPress={this.checkPermission.bind(this)}><Text style={styles.button_text}>查詢是否獲取了讀寫權(quán)限</Text></TouchableOpacity><TouchableOpacity style={styles.button_view}onPress={this.requestMultiplePermission.bind(this)}><Text style={styles.button_text}>一次申請(qǐng)所以權(quán)限</Text></TouchableOpacity></View>)}show(data) {ToastAndroid.show(data,ToastAndroid.SHORT)}/** 彈出提示框向用戶請(qǐng)求某項(xiàng)權(quán)限。返回一個(gè)promise,最終值為用戶是否同意了權(quán)限申請(qǐng)的布爾值。* 其中rationale參數(shù)是可選的,其結(jié)構(gòu)為包含title和message)的對(duì)象。* 此方法會(huì)和系統(tǒng)協(xié)商,是彈出系統(tǒng)內(nèi)置的權(quán)限申請(qǐng)對(duì)話框,* 還是顯示rationale中的信息以向用戶進(jìn)行解釋。* */async requestReadPermission() {try {//返回string類型const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,{//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限'title': '我要讀寫權(quán)限','message': '沒權(quán)限我不能工作,同意就好了'})if (granted === PermissionsAndroid.RESULTS.GRANTED) {this.show("你已獲取了讀寫權(quán)限")} else {this.show("獲取讀寫權(quán)限失敗")}} catch (err) {this.show(err.toString())}}async requestCarmeraPermission() {try {const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA,{//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限'title': '我要相機(jī)權(quán)限','message': '沒權(quán)限我不能工作,同意就好了'})if (granted === PermissionsAndroid.RESULTS.GRANTED) {this.show("你已獲取了相機(jī)權(quán)限")} else {this.show("獲取相機(jī)失敗")}} catch (err) {this.show(err.toString())}}async requestLocationPermission() {try {const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,{//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限'title': '我要地址查詢權(quán)限','message': '沒權(quán)限我不能工作,同意就好了'})if (granted === PermissionsAndroid.RESULTS.GRANTED) {this.show("你已獲取了地址查詢權(quán)限")} 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("是否獲取讀寫權(quán)限"+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]//返回得是對(duì)象類型const granteds = await PermissionsAndroid.requestMultiple(permissions)var data = "是否同意地址權(quán)限: "if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {data = data + "是\n"} else {data = data + "否\n"}data = data+"是否同意相機(jī)權(quán)限: "if (granteds["android.permission.CAMERA"] === "granted") {data = data + "是\n"} else {data = data + "否\n"}data = data+"是否同意存儲(chǔ)權(quán)限: "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'} }) 復(fù)制代碼// 12點(diǎn)了再不睡,我就要猝死了,其實(shí)運(yùn)行一下就知道什么意思了
沒時(shí)間解釋了,直接可以運(yùn)行看效果解釋的也很清楚 React Native項(xiàng)目
作者:mochixuan 鏈接:www.jianshu.com/p/29be198da… 來源:簡書 簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
轉(zhuǎn)載于:https://juejin.im/post/5c22d843f265da613f2f82fa
總結(jié)
以上是生活随笔為你收集整理的原生Android之(6.0及以上)权限申请的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: foo、bar到底是什么意思
- 下一篇: SpringCloud微服务云架构构建B