React-Native之Android(6.0及以上)权限申请详解
为什么android要申请权限
简单说下在android6.0及6.0以上一些google认为涉及“危险和用户隐私”的一些权限不仅要做清单文件(android/app/src/androidmainfest.xml)里面申请,还有单独调用api,去让用户选择是否同意你申请这个权限。
例如:你想要你的app有读写手机外置内存卡权限,那么你需要在清单文件里面加下面两行看字母应该懂的吧。但如果你的(android/app/build.gradle)里的 android{defaultconfig {targetsdkversion 23} } targetsdkversion >= 23你需要动态去申请权限,我发现react-native init app里面的targetsdkversion = 22这个,,,巧妙的躲过了,但有些手机系统是6.0或以上的手机targetsdkversion 22是获取不到有些权限的,至少我知道的乐视就是无法逃脱,其他手机应该也有,而且这是一个android的安全机制,现在开发的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去动态申请权限,再说一句,动态申请同意一次就可以下次调用申请它不会再提醒用户选择了,如果拒绝了,可以再次申请,且在申请钱弹一个dialog这个是手机系统的,我们只能提供一些解释, 下面用三个权限来做解释其实死是个 。
在低于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型数组 //就举一个例子 记得加上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点了再不睡,我就要猝死了,其实运行一下就知道什么意思了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: CentOS SSH无密码登录的配置