React-Native之Android(6.0及以上)權(quán)限申請

main0.jpg

為什么Android要申請權(quán)限

  • 簡單說下在Android6.0及6.0以上一些google認(rèn)為涉及“危險(xiǎn)和用戶隱私”的一些權(quán)限不僅要做清單文件(android/app/src/AndroidMainfest.xml)里面申請雕旨,還有單獨(dú)調(diào)用api扮匠,去讓用戶選擇是否同意你申請這個(gè)權(quán)限。
  • 例如:你想要你的app有讀寫手機(jī)外置內(nèi)存卡權(quán)限凡涩,那么你需要在清單文件里面加下面兩行看字母應(yīng)該懂的吧棒搜。但如果你的(android/app/build.gradle)里的 android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23你需要動態(tài)去申請權(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)該盡量去遵守。
  • 不多解釋了想了解可以search一下
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

效果

main.jpg

main1.jpg

main2.jpg

前提

  • (android/app/src/AndroidMainfest.xml) targetSdkVersion 改到 23或以上 悉罕,為什么要改赤屋??壁袄?类早?看上面

開始

  • React-Native里面有PermissionsAndroid去動態(tài)申請權(quán)限,再說一句嗜逻,動態(tài)申請同意一次就可以下次調(diào)用申請它不會再提醒用戶選擇了涩僻,如果拒絕了,可以再次申請栈顷,且在申請錢彈一個(gè)Dialog這個(gè)是手機(jī)系統(tǒng)的逆日,我們只能提供一些解釋,下面用三個(gè)權(quán)限來做解釋其實(shí)死是個(gè)萄凤。
  • 第一步
1. 在 android/app/src/AndroidMainfest.xml 添加

<!--獲取讀寫外置存儲權(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"/>
  • 第二步
//添加 PermissionsAndroid RN自帶的
import { PermissionsAndroid } from 'react-native'

  • 第三步

//給你們介紹下怎么用它的方法

//返回 Promise類型 里面是用戶是否授權(quán)的布爾值
1.  PermissionsAndroid.check(permission)  //permission是String型

//返回String類型  
'granted': 同意了
'denied' : 拒絕了
'never_ask_again' : 永久性拒絕下次再請求用戶也看不到了屏富,尷不尷尬
2. PermissionsAndroid.request(permission, rationale?) //permission是String型,rationale對象

//返回一個(gè)對象
3. PermissionsAndroid.requestMultiple(permissions) //permissions為String型數(shù)組

//就舉一個(gè)例子 記得加上async異步
async requestReadPermission() {
        try {
            //返回string類型
            const granted = await PermissionsAndroid.request(
                PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
                {
                    //第一次請求拒絕后提示用戶你為什么要這個(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())
        }
    }

//請求多個(gè)
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 = "是否同意地址權(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+"是否同意存儲權(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())
        }
    }
      
  • 完整代碼

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}>申請讀寫權(quán)限</Text>
                </TouchableOpacity>
                <TouchableOpacity style={styles.button_view}
                    onPress={this.requestCarmeraPermission.bind(this)}>
                    <Text style={styles.button_text}>申請相機(jī)權(quán)限</Text>
                </TouchableOpacity>
                <TouchableOpacity style={styles.button_view}
                    onPress={this.requestLocationPermission.bind(this)}>
                    <Text style={styles.button_text}>申請?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}>一次申請所以權(quán)限</Text>
                </TouchableOpacity>
            </View>
        )
    }

    show(data) {
        ToastAndroid.show(data,ToastAndroid.SHORT)
    }

    /*
    * 彈出提示框向用戶請求某項(xiàng)權(quán)限。返回一個(gè)promise噩死,最終值為用戶是否同意了權(quán)限申請的布爾值颤难。
    * 其中rationale參數(shù)是可選的,其結(jié)構(gòu)為包含title和message)的對象已维。
    * 此方法會和系統(tǒng)協(xié)商行嗤,是彈出系統(tǒng)內(nèi)置的權(quán)限申請對話框,
    * 還是顯示rationale中的信息以向用戶進(jìn)行解釋垛耳。
    * */
    async requestReadPermission() {
        try {
            //返回string類型
            const granted = await PermissionsAndroid.request(
                PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
                {
                    //第一次請求拒絕后提示用戶你為什么要這個(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,
                {
                    //第一次請求拒絕后提示用戶你為什么要這個(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,
                {
                    //第一次請求拒絕后提示用戶你為什么要這個(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
            ]
            //返回得是對象類型
            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+"是否同意存儲權(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'
    }
})

// 12點(diǎn)了再不睡栈雳,我就要猝死了护奈,其實(shí)運(yùn)行一下就知道什么意思了

沒時(shí)間解釋了,直接可以運(yùn)行看效果解釋的也很清楚

React Native項(xiàng)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哥纫,一起剝皮案震驚了整個(gè)濱河市霉旗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛀骇,老刑警劉巖厌秒,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異擅憔,居然都是意外死亡鸵闪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門暑诸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚌讼,“玉大人,你說我怎么就攤上這事屠列±材妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵笛洛,是天一觀的道長夏志。 經(jīng)常有香客問我,道長苛让,這世上最難降的妖魔是什么沟蔑? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮狱杰,結(jié)果婚禮上瘦材,老公的妹妹穿的比我還像新娘。我一直安慰自己仿畸,他們只是感情好食棕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著错沽,像睡著了一般簿晓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上千埃,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天憔儿,我揣著相機(jī)與錄音,去河邊找鬼放可。 笑死谒臼,一個(gè)胖子當(dāng)著我的面吹牛朝刊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜈缤,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拾氓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劫樟?” 一聲冷哼從身側(cè)響起痪枫,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叠艳,沒想到半個(gè)月后奶陈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡附较,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年吃粒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拒课。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徐勃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出早像,到底是詐尸還是另有隱情僻肖,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布卢鹦,位于F島的核電站臀脏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冀自。R本人自食惡果不足惜揉稚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熬粗。 院中可真熱鬧搀玖,春花似錦、人聲如沸驻呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽含末。三九已至延塑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間答渔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工侥涵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沼撕,地道東北人宋雏。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像务豺,于是被迫代替她去往敵國和親磨总。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容