当前位置:   article > 正文

React-Native之Android(6.0及以上)权限申请_react-native 如何进行隐私权限监测

react-native 如何进行隐私权限监测

转载自:https://blog.csdn.net/mochiwxtianya/article/details/80132861

main0.jpg

为什么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一下
  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  2. <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去动态申请权限,再说一句,动态申请同意一次就可以下次调用申请它不会再提醒用户选择了,如果拒绝了,可以再次申请,且在申请钱弹一个Dialog这个是手机系统的,我们只能提供一些解释,下面用三个权限来做解释其实死是个

  • 第一步

  1. 1. 在 android/app/src/AndroidMainfest.xml 添加
  2. <!--获取读写外置存储权限-->
  3. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  5. <!--获取相机权限-->
  6. <uses-permission android:name="android.permission.CAMERA"/>
  7. <!--获取地址相关权限-->
  8. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  • 第二步
  1. //添加 PermissionsAndroid RN自带的
  2. import { PermissionsAndroid } from 'react-native'
  • 第三步
  1. //给你们介绍下怎么用它的方法
  2. //返回 Promise类型 里面是用户是否授权的布尔值
  3. 1. PermissionsAndroid.check(permission) //permission是String
  4. //返回String类型
  5. 'granted': 同意了
  6. 'denied' : 拒绝了
  7. 'never_ask_again' : 永久性拒绝下次再请求用户也看不到了,尴不尴尬
  8. 2. PermissionsAndroid.request(permission, rationale?) //permission是String型,rationale对象
  9. //返回一个对象
  10. 3. PermissionsAndroid.requestMultiple(permissions) //permissions为String型数组
  11. //就举一个例子 记得加上async异步
  12. async requestReadPermission() {
  13. try {
  14. //返回string类型
  15. const granted = await PermissionsAndroid.request(
  16. PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
  17. {
  18. //第一次请求拒绝后提示用户你为什么要这个权限
  19. 'title': '我要读写权限',
  20. 'message': '没权限我不能工作,同意就好了'
  21. }
  22. )
  23. if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  24. this.show("你已获取了读写权限")
  25. } else {
  26. this.show("获取读写权限失败")
  27. }
  28. } catch (err) {
  29. this.show(err.toString())
  30. }
  31. }
  32. //核实
  33. checkPermission() {
  34. try {
  35. //返回Promise类型
  36. const granted = PermissionsAndroid.check(
  37. PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
  38. )
  39. granted.then((data)=>{
  40. this.show("是否获取读写权限"+data)
  41. }).catch((err)=>{
  42. this.show(err.toString())
  43. })
  44. } catch (err) {
  45. this.show(err.toString())
  46. }
  47. }
  48. //请求多个
  49. async requestMultiplePermission() {
  50. try {
  51. const permissions = [
  52. PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
  53. PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
  54. PermissionsAndroid.PERMISSIONS.CAMERA
  55. ]
  56. //返回得是对象类型
  57. const granteds = await PermissionsAndroid.requestMultiple(permissions)
  58. var data = "是否同意地址权限: "
  59. if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {
  60. data = data + "是\n"
  61. } else {
  62. data = data + "否\n"
  63. }
  64. data = data+"是否同意相机权限: "
  65. if (granteds["android.permission.CAMERA"] === "granted") {
  66. data = data + "是\n"
  67. } else {
  68. data = data + "否\n"
  69. }
  70. data = data+"是否同意存储权限: "
  71. if (granteds["android.permission.WRITE_EXTERNAL_STORAGE"] === "granted") {
  72. data = data + "是\n"
  73. } else {
  74. data = data + "否\n"
  75. }
  76. this.show(data)
  77. } catch (err) {
  78. this.show(err.toString())
  79. }
  80. }
  • 完整代码
  1. import React,{Component} from 'react'
  2. import {
  3. StyleSheet,
  4. View,
  5. Text,
  6. TouchableOpacity,
  7. ToastAndroid,
  8. PermissionsAndroid,
  9. } from 'react-native'
  10. export default class PermissionAndroidView extends Component {
  11. render() {
  12. return (
  13. <View style={styles.container}>
  14. <TouchableOpacity style={styles.button_view}
  15. onPress={this.requestReadPermission.bind(this)}>
  16. <Text style={styles.button_text}>申请读写权限</Text>
  17. </TouchableOpacity>
  18. <TouchableOpacity style={styles.button_view}
  19. onPress={this.requestCarmeraPermission.bind(this)}>
  20. <Text style={styles.button_text}>申请相机权限</Text>
  21. </TouchableOpacity>
  22. <TouchableOpacity style={styles.button_view}
  23. onPress={this.requestLocationPermission.bind(this)}>
  24. <Text style={styles.button_text}>申请访问地址权限</Text>
  25. </TouchableOpacity>
  26. <TouchableOpacity style={styles.button_view}
  27. onPress={this.checkPermission.bind(this)}>
  28. <Text style={styles.button_text}>查询是否获取了读写权限</Text>
  29. </TouchableOpacity>
  30. <TouchableOpacity style={styles.button_view}
  31. onPress={this.requestMultiplePermission.bind(this)}>
  32. <Text style={styles.button_text}>一次申请所以权限</Text>
  33. </TouchableOpacity>
  34. </View>
  35. )
  36. }
  37. show(data) {
  38. ToastAndroid.show(data,ToastAndroid.SHORT)
  39. }
  40. /*
  41. * 弹出提示框向用户请求某项权限。返回一个promise,最终值为用户是否同意了权限申请的布尔值。
  42. * 其中rationale参数是可选的,其结构为包含title和message)的对象。
  43. * 此方法会和系统协商,是弹出系统内置的权限申请对话框,
  44. * 还是显示rationale中的信息以向用户进行解释。
  45. * */
  46. async requestReadPermission() {
  47. try {
  48. //返回string类型
  49. const granted = await PermissionsAndroid.request(
  50. PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
  51. {
  52. //第一次请求拒绝后提示用户你为什么要这个权限
  53. 'title': '我要读写权限',
  54. 'message': '没权限我不能工作,同意就好了'
  55. }
  56. )
  57. if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  58. this.show("你已获取了读写权限")
  59. } else {
  60. this.show("获取读写权限失败")
  61. }
  62. } catch (err) {
  63. this.show(err.toString())
  64. }
  65. }
  66. async requestCarmeraPermission() {
  67. try {
  68. const granted = await PermissionsAndroid.request(
  69. PermissionsAndroid.PERMISSIONS.CAMERA,
  70. {
  71. //第一次请求拒绝后提示用户你为什么要这个权限
  72. 'title': '我要相机权限',
  73. 'message': '没权限我不能工作,同意就好了'
  74. }
  75. )
  76. if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  77. this.show("你已获取了相机权限")
  78. } else {
  79. this.show("获取相机失败")
  80. }
  81. } catch (err) {
  82. this.show(err.toString())
  83. }
  84. }
  85. async requestLocationPermission() {
  86. try {
  87. const granted = await PermissionsAndroid.request(
  88. PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
  89. {
  90. //第一次请求拒绝后提示用户你为什么要这个权限
  91. 'title': '我要地址查询权限',
  92. 'message': '没权限我不能工作,同意就好了'
  93. }
  94. )
  95. if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  96. this.show("你已获取了地址查询权限")
  97. } else {
  98. this.show("获取地址查询失败")
  99. }
  100. } catch (err) {
  101. this.show(err.toString())
  102. }
  103. }
  104. checkPermission() {
  105. try {
  106. //返回Promise类型
  107. const granted = PermissionsAndroid.check(
  108. PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
  109. )
  110. granted.then((data)=>{
  111. this.show("是否获取读写权限"+data)
  112. }).catch((err)=>{
  113. this.show(err.toString())
  114. })
  115. } catch (err) {
  116. this.show(err.toString())
  117. }
  118. }
  119. async requestMultiplePermission() {
  120. try {
  121. const permissions = [
  122. PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
  123. PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
  124. PermissionsAndroid.PERMISSIONS.CAMERA
  125. ]
  126. //返回得是对象类型
  127. const granteds = await PermissionsAndroid.requestMultiple(permissions)
  128. var data = "是否同意地址权限: "
  129. if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {
  130. data = data + "是\n"
  131. } else {
  132. data = data + "否\n"
  133. }
  134. data = data+"是否同意相机权限: "
  135. if (granteds["android.permission.CAMERA"] === "granted") {
  136. data = data + "是\n"
  137. } else {
  138. data = data + "否\n"
  139. }
  140. data = data+"是否同意存储权限: "
  141. if (granteds["android.permission.WRITE_EXTERNAL_STORAGE"] === "granted") {
  142. data = data + "是\n"
  143. } else {
  144. data = data + "否\n"
  145. }
  146. this.show(data)
  147. } catch (err) {
  148. this.show(err.toString())
  149. }
  150. }
  151. }
  152. const styles = StyleSheet.create({
  153. container: {
  154. flex: 1,
  155. padding: 10,
  156. },
  157. button_view: {
  158. margin:4,
  159. borderRadius: 4,
  160. backgroundColor: '#8d4dfc',
  161. alignItems: 'center',
  162. },
  163. button_text: {
  164. padding: 6,
  165. fontSize: 16,
  166. fontWeight: '600'
  167. }
  168. })
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/283827?site
推荐阅读
相关标签
  

闽ICP备14008679号