中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

React-Native之Android權(quán)限申請(qǐng)的示例分析

這篇文章主要介紹了React-Native之Android權(quán)限申請(qǐng)的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、雅安服務(wù)器托管、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、嘉陵網(wǎng)站維護(hù)、網(wǎng)站推廣。

為什么Android要申請(qǐng)權(quán)限

簡(jiǎn)單說(shuō)下在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有讀寫(xiě)手機(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è),,,巧妙的躲過(guò)了,但有些手機(jī)系統(tǒng)是6.0或以上的手機(jī)targetSdkVersion 22是獲取不到有些權(quán)限的,至少我知道的樂(lè)視就是無(wú)法逃脫,其他手機(jī)應(yīng)該也有,而且這是一個(gè)android的安全機(jī)制,現(xiàn)在開(kāi)發(fā)的app都應(yīng)該盡量去遵守。

不多解釋了想了解可以search一下

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

效果

React-Native之Android權(quán)限申請(qǐng)的示例分析 

React-Native之Android權(quán)限申請(qǐng)的示例分析

React-Native之Android權(quán)限申請(qǐng)的示例分析 

前提

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

開(kāi)始

React-Native里面有PermissionsAndroid去動(dòng)態(tài)申請(qǐng)權(quán)限,再說(shuō)一句,動(dòng)態(tài)申請(qǐng)同意一次就可以下次調(diào)用申請(qǐng)它不會(huì)再提醒用戶選擇了,如果拒絕了,可以再次申請(qǐng),且在申請(qǐng)錢(qián)彈一個(gè)Dialog這個(gè)是手機(jī)系統(tǒng)的,我們只能提供一些解釋?zhuān)?下面用三個(gè)權(quán)限來(lái)做解釋其實(shí)死是個(gè) 。

在低于Android 6.0的設(shè)備上,權(quán)限只要寫(xiě)在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)過(guò)的布爾值。

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)限名稱(chēng),對(duì)應(yīng)值為用戶授權(quán)與否。

第一步

1. 在 android/app/src/AndroidMainfest.xml 添加

<!--獲取讀寫(xiě)外置存儲(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類(lèi)型 里面是用戶是否授權(quán)的布爾值
1. PermissionsAndroid.check(permission) //permission是String型

//返回String類(lèi)型 
'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類(lèi)型
   const granted = await PermissionsAndroid.request(
    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
    {
     //第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
     'title': '我要讀寫(xiě)權(quán)限',
     'message': '沒(méi)權(quán)限我不能工作,同意就好了'
    }
   )
   if (granted === PermissionsAndroid.RESULTS.GRANTED) {
    this.show("你已獲取了讀寫(xiě)權(quán)限")
   } else {
    this.show("獲取讀寫(xiě)權(quán)限失敗")
   }
  } catch (err) {
   this.show(err.toString())
  }
 }

//核實(shí)
checkPermission() {
  try {
   //返回Promise類(lèi)型
   const granted = PermissionsAndroid.check(
    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
   )
   granted.then((data)=>{
    this.show("是否獲取讀寫(xiě)權(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ì)象類(lèi)型
   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)讀寫(xiě)權(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問(wèn)地址權(quán)限</Text>
    </TouchableOpacity>
    <TouchableOpacity style={styles.button_view}
         onPress={this.checkPermission.bind(this)}>
     <Text style={styles.button_text}>查詢(xún)是否獲取了讀寫(xiě)權(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類(lèi)型
   const granted = await PermissionsAndroid.request(
    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
    {
     //第一次請(qǐng)求拒絕后提示用戶你為什么要這個(gè)權(quán)限
     'title': '我要讀寫(xiě)權(quán)限',
     'message': '沒(méi)權(quán)限我不能工作,同意就好了'
    }
   )
   if (granted === PermissionsAndroid.RESULTS.GRANTED) {
    this.show("你已獲取了讀寫(xiě)權(quán)限")
   } else {
    this.show("獲取讀寫(xiě)權(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': '沒(méi)權(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': '我要地址查詢(xún)權(quán)限',
     'message': '沒(méi)權(quán)限我不能工作,同意就好了'
    }
   )

   if (granted === PermissionsAndroid.RESULTS.GRANTED) {
    this.show("你已獲取了地址查詢(xún)權(quán)限")
   } else {
    this.show("獲取地址查詢(xún)失敗")
   }
  } catch (err) {
   this.show(err.toString())
  }
 }

 checkPermission() {
  try {
   //返回Promise類(lèi)型
   const granted = PermissionsAndroid.check(
    PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
   )
   granted.then((data)=>{
    this.show("是否獲取讀寫(xiě)權(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ì)象類(lèi)型
   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)行一下就知道什么意思了

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“React-Native之Android權(quán)限申請(qǐng)的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

網(wǎng)站名稱(chēng):React-Native之Android權(quán)限申請(qǐng)的示例分析
鏈接地址:http://www.rwnh.cn/article2/jjesoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)網(wǎng)站維護(hù)、軟件開(kāi)發(fā)、搜索引擎優(yōu)化、小程序開(kāi)發(fā)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
榕江县| 阿图什市| 广河县| 阳朔县| 商洛市| 循化| 崇文区| 汽车| 吴堡县| 信丰县| 白山市| 佛坪县| 江西省| 大姚县| 宁波市| 松滋市| 铜川市| 磐石市| 驻马店市| 什邡市| 泗洪县| 四会市| 建始县| 德兴市| 肇东市| 木兰县| 法库县| 湖口县| 开封县| 宜春市| 抚松县| 洛扎县| 蕲春县| 长子县| 东方市| 迁安市| 资阳市| 堆龙德庆县| 明光市| 永年县| 林甸县|