React-Native之Android(6.0及以上)權(quán)限申請(qǐng)?jiān)斀?/h1>
更新時(shí)間:2017年11月16日 16:45:07 作者:mochixuan
這篇文章主要介紹了React-Native之Android(6.0及以上)權(quán)限申請(qǐng)?jiān)斀?小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
為什么Android要申請(qǐng)權(quán)限
簡(jiǎn)單說下在Android6.0及6.0以上一些google認(rèn)為涉及“危險(xiǎn)和用戶隱私”的一些權(quán)限不僅要做清單文件(android/app/src/AndroidMainfest.xml)里面申請(qǐng),還有單獨(dú)調(diào)用api,去讓用戶選擇是否同意你申請(qǐng)這個(gè)權(quán)限。
例如:你想要你的app有讀寫手機(jī)外置內(nèi)存卡權(quán)限,那么你需要在清單文件里面加下面兩行看字母應(yīng)該懂的吧。但如果你的(android/app/build.gradle)里的 android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23你需要?jiǎng)討B(tài)去申請(qǐng)權(quán)限,我發(fā)現(xiàn)react-native init app里面的targetSdkVersion = 22這個(gè),,,巧妙的躲過了,但有些手機(jī)系統(tǒng)是6.0或以上的手機(jī)targetSdkVersion 22是獲取不到有些權(quán)限的,至少我知道的樂視就是無法逃脫,其他手機(jī)應(yīng)該也有,而且這是一個(gè)android的安全機(jī)制,現(xiàn)在開發(fā)的app都應(yīng)該盡量去遵守。
不多解釋了想了解可以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去動(dòng)態(tài)申請(qǐng)權(quán)限,再說一句,動(dòng)態(tài)申請(qǐng)同意一次就可以下次調(diào)用申請(qǐng)它不會(huì)再提醒用戶選擇了,如果拒絕了,可以再次申請(qǐng),且在申請(qǐng)錢彈一個(gè)Dialog這個(gè)是手機(jī)系統(tǒng)的,我們只能提供一些解釋, 下面用三個(gè)權(quán)限來做解釋其實(shí)死是個(gè) 。
在低于Android 6.0的設(shè)備上,權(quán)限只要寫在AndroidManifest.xml里就會(huì)自動(dòng)獲得,此情形下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)
返回一個(gè)promise,最終值為用戶是否授權(quán)過的布爾值。
request(permission, rationale?)
彈出提示框向用戶請(qǐng)求某項(xiàng)權(quán)限。返回一個(gè)promise,最終值為用戶是否同意了權(quán)限申請(qǐng)的布爾值。
requestMultiple(permissions)
在一個(gè)彈出框中向用戶請(qǐng)求多個(gè)權(quán)限。返回值為一個(gè)object,key為各權(quán)限名稱,對(duì)應(yīng)值為用戶授權(quán)與否。
第一步
1. 在 android/app/src/AndroidMainfest.xml 添加
<!--獲取讀寫外置存儲(chǔ)權(quán)限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--獲取相機(jī)權(quán)限-->
<uses-permission android:name="android.permission.CAMERA"/>
<!--獲取地址相關(guān)權(quán)限-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
第二步
//添加 PermissionsAndroid RN自帶的
import { PermissionsAndroid } from 'react-native'
第三步
//給你們介紹下怎么用它的方法
//返回 Promise類型 里面是用戶是否授權(quán)的布爾值
1. PermissionsAndroid.check(permission) //permission是String型
//返回String類型
'granted': 同意了
'denied' : 拒絕了
'never_ask_again' : 永久性拒絕下次再請(qǐng)求用戶也看不到了,尷不尷尬
2. PermissionsAndroid.request(permission, rationale?) //permission是String型,rationale對(duì)象
//返回一個(gè)對(duì)象
3. PermissionsAndroid.requestMultiple(permissions) //permissions為String型數(shù)組
//就舉一個(gè)例子 記得加上async異步
async requestReadPermission() {
try {
//返回string類型
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要讀寫權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了讀寫權(quán)限")
} else {
this.show("獲取讀寫權(quán)限失敗")
}
} catch (err) {
this.show(err.toString())
}
}
//核實(shí)
checkPermission() {
try {
//返回Promise類型
const granted = PermissionsAndroid.check(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
)
granted.then((data)=>{
this.show("是否獲取讀寫權(quán)限"+data)
}).catch((err)=>{
this.show(err.toString())
})
} catch (err) {
this.show(err.toString())
}
}
//請(qǐng)求多個(gè)
async requestMultiplePermission() {
try {
const permissions = [
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
PermissionsAndroid.PERMISSIONS.CAMERA
]
//返回得是對(duì)象類型
const granteds = await PermissionsAndroid.requestMultiple(permissions)
var data = "是否同意地址權(quán)限: "
if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意相機(jī)權(quán)限: "
if (granteds["android.permission.CAMERA"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意存儲(chǔ)權(quán)限: "
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}>申請(qǐng)讀寫權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.requestCarmeraPermission.bind(this)}>
<Text style={styles.button_text}>申請(qǐng)相機(jī)權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.requestLocationPermission.bind(this)}>
<Text style={styles.button_text}>申請(qǐng)?jiān)L問地址權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.checkPermission.bind(this)}>
<Text style={styles.button_text}>查詢是否獲取了讀寫權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.requestMultiplePermission.bind(this)}>
<Text style={styles.button_text}>一次申請(qǐng)所以權(quán)限</Text>
</TouchableOpacity>
</View>
)
}
show(data) {
ToastAndroid.show(data,ToastAndroid.SHORT)
}
/*
* 彈出提示框向用戶請(qǐng)求某項(xiàng)權(quán)限。返回一個(gè)promise,最終值為用戶是否同意了權(quán)限申請(qǐng)的布爾值。
* 其中rationale參數(shù)是可選的,其結(jié)構(gòu)為包含title和message)的對(duì)象。
* 此方法會(huì)和系統(tǒng)協(xié)商,是彈出系統(tǒng)內(nèi)置的權(quán)限申請(qǐng)對(duì)話框,
* 還是顯示rationale中的信息以向用戶進(jìn)行解釋。
* */
async requestReadPermission() {
try {
//返回string類型
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要讀寫權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了讀寫權(quán)限")
} else {
this.show("獲取讀寫權(quán)限失敗")
}
} catch (err) {
this.show(err.toString())
}
}
async requestCarmeraPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要相機(jī)權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了相機(jī)權(quán)限")
} else {
this.show("獲取相機(jī)失敗")
}
} catch (err) {
this.show(err.toString())
}
}
async requestLocationPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要地址查詢權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了地址查詢權(quán)限")
} 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("是否獲取讀寫權(quán)限"+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
]
//返回得是對(duì)象類型
const granteds = await PermissionsAndroid.requestMultiple(permissions)
var data = "是否同意地址權(quán)限: "
if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意相機(jī)權(quán)限: "
if (granteds["android.permission.CAMERA"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意存儲(chǔ)權(quán)限: "
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點(diǎn)了再不睡,我就要猝死了,其實(shí)運(yùn)行一下就知道什么意思了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- react-native android狀態(tài)欄的實(shí)現(xiàn)
- React-native橋接Android原生開發(fā)詳解
- React-Native實(shí)現(xiàn)ListView組件之上拉刷新實(shí)例(iOS和Android通用)
- react-native 封裝選擇彈出框示例(試用ios&android)
- React-Native Android 與 IOS App使用一份代碼實(shí)現(xiàn)方法
- Android React-Native通信數(shù)據(jù)模型分析
- android中使用react-native設(shè)置應(yīng)用啟動(dòng)頁過程詳解
相關(guān)文章
-
Android編程實(shí)現(xiàn)Toast自定義布局簡(jiǎn)單示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)Toast自定義布局的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Toast自定義布局的實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下 2017-02-02
-
Android程序靜默安裝安裝后重新啟動(dòng)APP的方法
這篇文章主要介紹了Android 靜默安裝,安裝后重新啟動(dòng)APP的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下 2018-01-01
-
Android中使用自定義ViewGroup的總結(jié)
本篇文章主要介紹了Android中使用自定義ViewGroup的總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
2017-01-01
-
Android自定義控件實(shí)現(xiàn)隨手指移動(dòng)的小球
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)隨手指移動(dòng)的小球,隨著手指觸摸移動(dòng)而移動(dòng)的效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2016-10-10
-
Android studio實(shí)現(xiàn)菜單操作
這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)菜單操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2021-10-10
-
Android編程設(shè)計(jì)模式之備忘錄模式詳解
這篇文章主要介紹了Android編程設(shè)計(jì)模式之備忘錄模式,結(jié)合實(shí)例形式詳細(xì)分析了Android備忘錄模式的概念、原理、應(yīng)用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下 2017-12-12
-
Android6.0獲取動(dòng)態(tài)權(quán)限代碼示例
這篇文章主要介紹了Android6.0以上獲取動(dòng)態(tài)權(quán)限代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下 2020-11-11
-
Fiddler實(shí)現(xiàn)手機(jī)抓包之小白入門必看
這篇文章主要介紹了Fiddler實(shí)現(xiàn)手機(jī)抓包之小白入門必看篇,需要的朋友可以參考下 2018-03-03
-
Android SpringAnimation彈性動(dòng)畫解析
這篇文章主要為大家詳細(xì)介紹了Android SpringAnimation彈性動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2017-03-03
最新評(píng)論
為什么Android要申請(qǐng)權(quán)限
簡(jiǎn)單說下在Android6.0及6.0以上一些google認(rèn)為涉及“危險(xiǎn)和用戶隱私”的一些權(quán)限不僅要做清單文件(android/app/src/AndroidMainfest.xml)里面申請(qǐng),還有單獨(dú)調(diào)用api,去讓用戶選擇是否同意你申請(qǐng)這個(gè)權(quán)限。
例如:你想要你的app有讀寫手機(jī)外置內(nèi)存卡權(quán)限,那么你需要在清單文件里面加下面兩行看字母應(yīng)該懂的吧。但如果你的(android/app/build.gradle)里的 android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23你需要?jiǎng)討B(tài)去申請(qǐng)權(quán)限,我發(fā)現(xiàn)react-native init app里面的targetSdkVersion = 22這個(gè),,,巧妙的躲過了,但有些手機(jī)系統(tǒng)是6.0或以上的手機(jī)targetSdkVersion 22是獲取不到有些權(quán)限的,至少我知道的樂視就是無法逃脫,其他手機(jī)應(yīng)該也有,而且這是一個(gè)android的安全機(jī)制,現(xiàn)在開發(fā)的app都應(yīng)該盡量去遵守。
不多解釋了想了解可以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去動(dòng)態(tài)申請(qǐng)權(quán)限,再說一句,動(dòng)態(tài)申請(qǐng)同意一次就可以下次調(diào)用申請(qǐng)它不會(huì)再提醒用戶選擇了,如果拒絕了,可以再次申請(qǐng),且在申請(qǐng)錢彈一個(gè)Dialog這個(gè)是手機(jī)系統(tǒng)的,我們只能提供一些解釋, 下面用三個(gè)權(quán)限來做解釋其實(shí)死是個(gè) 。
在低于Android 6.0的設(shè)備上,權(quán)限只要寫在AndroidManifest.xml里就會(huì)自動(dòng)獲得,此情形下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)
返回一個(gè)promise,最終值為用戶是否授權(quán)過的布爾值。
request(permission, rationale?)
彈出提示框向用戶請(qǐng)求某項(xiàng)權(quán)限。返回一個(gè)promise,最終值為用戶是否同意了權(quán)限申請(qǐng)的布爾值。
requestMultiple(permissions)
在一個(gè)彈出框中向用戶請(qǐng)求多個(gè)權(quán)限。返回值為一個(gè)object,key為各權(quán)限名稱,對(duì)應(yīng)值為用戶授權(quán)與否。
第一步
1. 在 android/app/src/AndroidMainfest.xml 添加
<!--獲取讀寫外置存儲(chǔ)權(quán)限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--獲取相機(jī)權(quán)限--> <uses-permission android:name="android.permission.CAMERA"/> <!--獲取地址相關(guān)權(quán)限--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
第二步
//添加 PermissionsAndroid RN自帶的
import { PermissionsAndroid } from 'react-native'
第三步
//給你們介紹下怎么用它的方法
//返回 Promise類型 里面是用戶是否授權(quán)的布爾值
1. PermissionsAndroid.check(permission) //permission是String型
//返回String類型
'granted': 同意了
'denied' : 拒絕了
'never_ask_again' : 永久性拒絕下次再請(qǐng)求用戶也看不到了,尷不尷尬
2. PermissionsAndroid.request(permission, rationale?) //permission是String型,rationale對(duì)象
//返回一個(gè)對(duì)象
3. PermissionsAndroid.requestMultiple(permissions) //permissions為String型數(shù)組
//就舉一個(gè)例子 記得加上async異步
async requestReadPermission() {
try {
//返回string類型
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要讀寫權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了讀寫權(quán)限")
} else {
this.show("獲取讀寫權(quán)限失敗")
}
} catch (err) {
this.show(err.toString())
}
}
//核實(shí)
checkPermission() {
try {
//返回Promise類型
const granted = PermissionsAndroid.check(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
)
granted.then((data)=>{
this.show("是否獲取讀寫權(quán)限"+data)
}).catch((err)=>{
this.show(err.toString())
})
} catch (err) {
this.show(err.toString())
}
}
//請(qǐng)求多個(gè)
async requestMultiplePermission() {
try {
const permissions = [
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
PermissionsAndroid.PERMISSIONS.CAMERA
]
//返回得是對(duì)象類型
const granteds = await PermissionsAndroid.requestMultiple(permissions)
var data = "是否同意地址權(quán)限: "
if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意相機(jī)權(quán)限: "
if (granteds["android.permission.CAMERA"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意存儲(chǔ)權(quán)限: "
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}>申請(qǐng)讀寫權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.requestCarmeraPermission.bind(this)}>
<Text style={styles.button_text}>申請(qǐng)相機(jī)權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.requestLocationPermission.bind(this)}>
<Text style={styles.button_text}>申請(qǐng)?jiān)L問地址權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.checkPermission.bind(this)}>
<Text style={styles.button_text}>查詢是否獲取了讀寫權(quán)限</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button_view}
onPress={this.requestMultiplePermission.bind(this)}>
<Text style={styles.button_text}>一次申請(qǐng)所以權(quán)限</Text>
</TouchableOpacity>
</View>
)
}
show(data) {
ToastAndroid.show(data,ToastAndroid.SHORT)
}
/*
* 彈出提示框向用戶請(qǐng)求某項(xiàng)權(quán)限。返回一個(gè)promise,最終值為用戶是否同意了權(quán)限申請(qǐng)的布爾值。
* 其中rationale參數(shù)是可選的,其結(jié)構(gòu)為包含title和message)的對(duì)象。
* 此方法會(huì)和系統(tǒng)協(xié)商,是彈出系統(tǒng)內(nèi)置的權(quán)限申請(qǐng)對(duì)話框,
* 還是顯示rationale中的信息以向用戶進(jìn)行解釋。
* */
async requestReadPermission() {
try {
//返回string類型
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要讀寫權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了讀寫權(quán)限")
} else {
this.show("獲取讀寫權(quán)限失敗")
}
} catch (err) {
this.show(err.toString())
}
}
async requestCarmeraPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要相機(jī)權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了相機(jī)權(quán)限")
} else {
this.show("獲取相機(jī)失敗")
}
} catch (err) {
this.show(err.toString())
}
}
async requestLocationPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
//第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
'title': '我要地址查詢權(quán)限',
'message': '沒權(quán)限我不能工作,同意就好了'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.show("你已獲取了地址查詢權(quán)限")
} 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("是否獲取讀寫權(quán)限"+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
]
//返回得是對(duì)象類型
const granteds = await PermissionsAndroid.requestMultiple(permissions)
var data = "是否同意地址權(quán)限: "
if (granteds["android.permission.ACCESS_FINE_LOCATION"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意相機(jī)權(quán)限: "
if (granteds["android.permission.CAMERA"] === "granted") {
data = data + "是\n"
} else {
data = data + "否\n"
}
data = data+"是否同意存儲(chǔ)權(quán)限: "
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點(diǎn)了再不睡,我就要猝死了,其實(shí)運(yùn)行一下就知道什么意思了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- react-native android狀態(tài)欄的實(shí)現(xiàn)
- React-native橋接Android原生開發(fā)詳解
- React-Native實(shí)現(xiàn)ListView組件之上拉刷新實(shí)例(iOS和Android通用)
- react-native 封裝選擇彈出框示例(試用ios&android)
- React-Native Android 與 IOS App使用一份代碼實(shí)現(xiàn)方法
- Android React-Native通信數(shù)據(jù)模型分析
- android中使用react-native設(shè)置應(yīng)用啟動(dòng)頁過程詳解
相關(guān)文章
Android編程實(shí)現(xiàn)Toast自定義布局簡(jiǎn)單示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)Toast自定義布局的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Toast自定義布局的實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
Android程序靜默安裝安裝后重新啟動(dòng)APP的方法
這篇文章主要介紹了Android 靜默安裝,安裝后重新啟動(dòng)APP的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Android中使用自定義ViewGroup的總結(jié)
本篇文章主要介紹了Android中使用自定義ViewGroup的總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Android自定義控件實(shí)現(xiàn)隨手指移動(dòng)的小球
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)隨手指移動(dòng)的小球,隨著手指觸摸移動(dòng)而移動(dòng)的效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android studio實(shí)現(xiàn)菜單操作
這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)菜單操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Android編程設(shè)計(jì)模式之備忘錄模式詳解
這篇文章主要介紹了Android編程設(shè)計(jì)模式之備忘錄模式,結(jié)合實(shí)例形式詳細(xì)分析了Android備忘錄模式的概念、原理、應(yīng)用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-12-12
Android6.0獲取動(dòng)態(tài)權(quán)限代碼示例
這篇文章主要介紹了Android6.0以上獲取動(dòng)態(tài)權(quán)限代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Fiddler實(shí)現(xiàn)手機(jī)抓包之小白入門必看
這篇文章主要介紹了Fiddler實(shí)現(xiàn)手機(jī)抓包之小白入門必看篇,需要的朋友可以參考下2018-03-03
Android SpringAnimation彈性動(dòng)畫解析
這篇文章主要為大家詳細(xì)介紹了Android SpringAnimation彈性動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

