我是靠谱客的博主 超级吐司,这篇文章主要介绍React-Native之Android(6.0及以上)权限申请,现在分享给大家,希望可以做个参考。

main0.jpgmain0.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
2
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

效果

main.jpgmain.jpg
main1.jpgmain1.jpg
main2.jpgmain2.jpg

前提

  • (android/app/src/AndroidMainfest.xml) targetSdkVersion 改到 23或以上 ,为什么要改????看上面

开始

  • React-Native里面有PermissionsAndroid去动态申请权限,再说一句,动态申请同意一次就可以下次调用申请它不会再提醒用户选择了,如果拒绝了,可以再次申请,且在申请钱弹一个Dialog这个是手机系统的,我们只能提供一些解释,下面用三个权限来做解释其实死是个

  • 第一步
复制代码
1
2
3
4
5
6
7
8
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"/>
  • 第二步
复制代码
1
2
//添加 PermissionsAndroid RN自带的 import { PermissionsAndroid } from 'react-native'
  • 第三步
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//给你们介绍下怎么用它的方法 //返回 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()) } }
  • 完整代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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
链接:https://juejin.im/post/5a0c51d3f265da431e164df9
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载https://juejin.im/post/5a0c51d3f265da431e164df9

最后

以上就是超级吐司最近收集整理的关于React-Native之Android(6.0及以上)权限申请的全部内容,更多相关React-Native之Android(6内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部