Разрешающее приложение React-Native для Android (6.0 и выше)

Android React.js React Native

main0.jpg
main0.jpg

Почему Android должен запрашивать разрешения

  • Проще говоря, некоторые разрешения, которые, по мнению Google, связаны с «опасностью и конфиденциальностью пользователей» в Android 6.0 и более поздних версиях, должны не только применяться в файле манифеста (android/app/src/AndroidMainfest.xml), но и вызываться API отдельно, чтобы позволить пользователь выбирает, соглашаться ли с вашим запросом на это разрешение.
  • Например: если вы хотите, чтобы ваше приложение имело разрешение на чтение и запись внешней карты памяти мобильного телефона, вам нужно добавить следующие две строки в файл манифеста, чтобы понимать буквы. Но если у вас есть android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23 в вашем (android/app/build.gradle), вам необходимо динамически обращаться за разрешениями, я нашел targetSdkVersion = 22 в приложении React-Native init, Умно сбежал, но система некоторых мобильных телефонов 6.0 или выше targetSdkVersion 22 не может получить некоторые разрешения, по крайней мере, я знаю, что LeTV не может сбежать, другие мобильные телефоны также должны иметь, и это механизм безопасности Android, теперь Разработанное приложение должно попробовать максимально его соблюдать.
  • Мне особо нечего объяснять, если хотите узнать больше, можете поискать.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Эффект

main.jpg
main.jpg

main1.jpg
main1.jpg

main2.jpg
main2.jpg

помещение

  • (android/app/src/AndroidMainfest.xml) targetSdkVersion изменен на 23 или выше, зачем его менять? ? ? ? Погляди

Начинать

  • В React-Native есть PermissionsAndroid для динамического применения разрешений. Опять же, если вы согласитесь на динамическое приложение один раз, вы можете вызвать приложение в следующий раз. Оно не будет напоминать пользователю о выборе. Если вы откажетесь, вы можете подать заявку снова , и воспроизводить диалог, когда вы подаете заявку на получение денег. Для системы мобильной связи мы можем предоставить только некоторые пояснения,Следующие три разрешения используются для объяснения того, что смерть на самом деле является.

  • первый шаг
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点了再不睡,我就要猝死了,其实运行一下就知道什么意思了

У меня нет времени объяснять, я могу запустить его напрямую, чтобы увидеть эффект, и объяснение очень понятное.

Реагировать на нативный проект