为什么Android的要申请权限

简单说下在Android6.0及6.0以上一些谷歌认为涉及“危险和用户隐私”的一些权限不仅要做清单文件(机器人/应用/ SRC / AndroidMainfest.xml)里面申请,还有单独调用API,去让用户选择是否同意你申请这个权限。

例如:你想要你的应用程序有读写手机外置内存卡权限,那么你需要在清单文件里面加下面两行看字母应该懂的吧但如果你的(机器人/应用/的build.gradle)里的android {defaultConfig {targetSdkVersion 23}} targetSdkVersion> = 23你需要动态去申请权限,我发现react-native init app里面的targetSdkVersion = 22这个,,,巧妙的躲过了,但有些手机系统是6.0或以上的手机targetSdkVersion 22是获取不到有些权限的,至少我知道的乐视就是无法逃脱,其他手机应该也有,而且这是一个android的安全机制,现在开发的app都应该尽量去遵守。 不多解释了想了解可以搜索一下

<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或以上,为什么要改????看上面
复制代码

开始

反应母语里面有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点了再不睡,我就要猝死了,其实运行一下就知道什么意思了

没时间解释了,直接可以运行看效果解释的也很清楚 React Native项目

作者:mochixuan 链接:www.jianshu.com/p/29be198da… 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://juejin.im/post/5c22d843f265da613f2f82fa

原生Android之(6.0及以上)权限申请相关推荐

  1. Android 6.0动态权限申请

    Android 6.0动态权限申请 特别感谢: https://www.jianshu.com/p/2fe4fb3e8ce0 本文是在该文的基础上添加了类似自己的读后感才完成的. 我并不希望成为白求恩 ...

  2. Android 6.0运行时权限管理

    运行时权限管理 定义: 之前我们的App需要权限,只需在manifest中申明,用户安装后,一切申明的权限都可使用. 但是Android 6.0以后Android M把权限管理做了加强处理,除了需要在 ...

  3. Android6.0动态权限申请及RxPermissions权限库使用

    一.AndroidManifest.xml 所有权限列表: 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据 ...

  4. 最容易理解的Android6.0动态权限申请教程

    1.前言 这已经是N年前的知识点了,但是我一直以来都有点逃避学习这个,而且印象中很麻烦,后来也不间断有学习过一点,但是一直没认真去用过,所以对这个android6.0的动态权限申请一直是不清楚的状态, ...

  5. Android 从6.0,7.0,8.0,9.0,10.0的特性整理和适配方案(不好含全部新特性,总结了一些可能应用中会遇到的)

    总所周知从Android6.0之后的每一次系统迭代,系统特性都有比较大的改变.平时做开发的时候都是有在注意这些方面的适配,但是一直没有时间去整个一下,今天正好来总结一下吧.如果觉的太长,可以等下一篇文 ...

  6. Android权限申请和网络监听封装

    欢迎使用 红叶岭谷-(网络.权限) 封装包 在应用程序app开发过程中,我们经常用到网络的判断,网络 以及 Android6.0后的权限申请 每次开发都是一个不小的工程量,因此为了方便我专门将他们封装 ...

  7. 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)

    前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用.这些权限一般分为三种:(1)普通权限:直接man ...

  8. s5原生android 5.0,三星Galaxy S5升级Android 5.0:美味棒棒糖

    快速设置与通知 作为Android 5.0 Lollipop重要的新特性之一,在全新TouchWiz的声音与通知菜单也中也新增了智能通知选项,可对每一个应用的通知状态进行管理,避免敏感信息泄露,而通知 ...

  9. android 动态获取权限有哪些,Android 6.0+ 动态获取权限

    Android 6.0+ 动态获取权限 这里有一个现成的库,可以直接拿来用.方便简单 1.向app下的gradle添加依赖: dependencies{ // android 6.0+ 动态获取权限 ...

最新文章

  1. rman备份后为什么要同时备份归档日志
  2. 区块链概况:从数字货币说起
  3. 用Python爬取好奇心日报
  4. python拼音怎么写-Python 中拼音库 PyPinyin 的用法
  5. LAMP搭建之三:php编译安装
  6. java类变量什么时候初始化_Java类变量的初始化时机
  7. 18.外部相机校准——介绍,几何相机校正,自由度 测验,刚体变换,符号_1
  8. 用doxygen自动生成文档
  9. WPF中的附加行为简介
  10. 面试准备每日系列:计算机底层之并发编程(一)原子性、atomic、CAS、ABA、可见性、有序性、指令重排、volatile、内存屏障、缓存一致性、四核八线程
  11. linux文件系统基础知识
  12. android fragment实例化,Android使得Fragment 切换时不重新实例化
  13. java 长整型long_C语言和java 长整型为何打印不同?
  14. 高端游戏计算机配置单,全球最顶级的游戏电脑配置 高端游戏电脑装机推荐
  15. 【每天学点Python】案例一:汇率换算
  16. w10桌面计算机图标箭头去除,win10桌面图标有个箭头如何去掉_去掉win10桌面图标箭头的方法-系统城...
  17. 解决win10显示无线网络已连接但是不能上网的问题
  18. 弘辽科技:淘宝开店审核不通过怎么办?认证复核不通过怎么办?
  19. 计算机应用技术与物联网专业介绍,《物联网应用技术》专业简介
  20. composingBuild依赖统一管理实践

热门文章

  1. 模拟摇奖:从1-36中随机抽出8个不重复的数字
  2. hdu 4614 线段树
  3. 理解模板引擎Razor 的原理
  4. Flex值得一看参考资源
  5. 使用Altera综合工具Quartus II下载到FPGA时无法识别USB-Blaster问题
  6. Quartus II工程文件的后缀含义
  7. JsonDB php json数据库 NoSql
  8. javaweb 中的过滤器 包装器
  9. Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c
  10. AngularJS+Satellizer+Node.js+MongoDB-Instagram-20