原生Android之(6.0及以上)權限申請

爲何Android的要申請權限react

簡單說下在Android6.0及6.0以上一些谷歌認爲涉及「危險和用戶隱私」的一些權限不只要作清單文件(機器人/應用/ SRC / AndroidMainfest.xml)裏面申請,還有單獨調用API,去讓用戶選擇是否贊成你申請這個權限。android

例如:你想要你的應用程序有讀寫手機外置內存卡權限,那麼你須要在清單文件裏面加下面兩行看字母應該懂的吧但若是你的(機器人/應用/的build.gradle)裏的android {defaultConfig {targetSdkVersion 23}} targetSdkVersion> = 23你須要動態去申請權限,我發現react-native init app裏面的targetSdkVersion = 22這個,,,巧妙的躲過了,但有些手機系統是6.0或以上的手機targetSdkVersion 22是獲取不到有些權限的,至少我知道的樂視就是沒法逃脫,其餘手機應該也有,並且這是一個android的安全機制,如今開發的app都應該儘可能去遵照。 很少解釋了想了解能夠搜索一下react-native

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
複製代碼

效果數組

前提promise

(android / app / src / AndroidMainfest.xml)targetSdkVersion改到23或以上,爲何要改????看上面
複製代碼

開始安全

反應母語裏面有PermissionsAndroid去動態申請權限,再說一句,動態申請贊成一次就能夠下次調用申請它不會再提醒用戶選擇了,若是拒絕了,能夠再次申請,且在申請錢彈一個對話框這個是手機系統的,咱們只能提供一些解釋,下面用三個權限來作解釋其實死是個。bash

第一步app

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'
複製代碼

第三步async

//給大家介紹下怎麼用它的方法

//返回 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點了再不睡,我就要猝死了,其實運行一下就知道什麼意思了

沒時間解釋了,直接能夠運行看效果解釋的也很清楚 React Native項目

做者:mochixuan 連接:www.jianshu.com/p/29be198da… 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索