最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React-Native之Android(6.0及以上)權限申請詳解

 更新時間:2017年11月16日 16:45:07   作者:mochixuan  
這篇文章主要介紹了React-Native之Android(6.0及以上)權限申請詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

為什么Android要申請權限

簡單說下在Android6.0及6.0以上一些google認為涉及“危險和用戶隱私”的一些權限不僅要做清單文件(android/app/src/AndroidMainfest.xml)里面申請,還有單獨調(diào)用api,去讓用戶選擇是否同意你申請這個權限。

例如:你想要你的app有讀寫手機外置內(nèi)存卡權限,那么你需要在清單文件里面加下面兩行看字母應該懂的吧。但如果你的(android/app/build.gradle)里的 android{defaultConfig {targetSdkVersion 23} } targetSdkVersion >= 23你需要動態(tài)去申請權限,我發(fā)現(xiàn)react-native init app里面的targetSdkVersion = 22這個,,,巧妙的躲過了,但有些手機系統(tǒng)是6.0或以上的手機targetSdkVersion 22是獲取不到有些權限的,至少我知道的樂視就是無法逃脫,其他手機應該也有,而且這是一個android的安全機制,現(xiàn)在開發(fā)的app都應該盡量去遵守。

不多解釋了想了解可以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去動態(tài)申請權限,再說一句,動態(tài)申請同意一次就可以下次調(diào)用申請它不會再提醒用戶選擇了,如果拒絕了,可以再次申請,且在申請錢彈一個Dialog這個是手機系統(tǒng)的,我們只能提供一些解釋, 下面用三個權限來做解釋其實死是個 。

在低于Android 6.0的設備上,權限只要寫在AndroidManifest.xml里就會自動獲得,此情形下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)
返回一個promise,最終值為用戶是否授權過的布爾值。

request(permission, rationale?)
彈出提示框向用戶請求某項權限。返回一個promise,最終值為用戶是否同意了權限申請的布爾值。

requestMultiple(permissions)
在一個彈出框中向用戶請求多個權限。返回值為一個object,key為各權限名稱,對應值為用戶授權與否。

第一步

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型數(shù)組

//就舉一個例子 記得加上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參數(shù)是可選的,其結構為包含title和message)的對象。
 * 此方法會和系統(tǒng)協(xié)商,是彈出系統(tǒng)內(nèi)置的權限申請對話框,
 * 還是顯示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點了再不睡,我就要猝死了,其實運行一下就知道什么意思了

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android編程實現(xiàn)Toast自定義布局簡單示例

    Android編程實現(xiàn)Toast自定義布局簡單示例

    這篇文章主要介紹了Android編程實現(xiàn)Toast自定義布局的方法,結合簡單實例形式分析了Toast自定義布局的實現(xiàn)步驟與相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • Android程序靜默安裝安裝后重新啟動APP的方法

    Android程序靜默安裝安裝后重新啟動APP的方法

    這篇文章主要介紹了Android 靜默安裝,安裝后重新啟動APP的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Android中使用自定義ViewGroup的總結

    Android中使用自定義ViewGroup的總結

    本篇文章主要介紹了Android中使用自定義ViewGroup的總結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Android自定義控件實現(xiàn)隨手指移動的小球

    Android自定義控件實現(xiàn)隨手指移動的小球

    這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)隨手指移動的小球,隨著手指觸摸移動而移動的效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android studio實現(xiàn)菜單操作

    Android studio實現(xiàn)菜單操作

    這篇文章主要為大家詳細介紹了Android studio實現(xiàn)菜單操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android編程設計模式之備忘錄模式詳解

    Android編程設計模式之備忘錄模式詳解

    這篇文章主要介紹了Android編程設計模式之備忘錄模式,結合實例形式詳細分析了Android備忘錄模式的概念、原理、應用場景、用法及相關操作注意事項,需要的朋友可以參考下
    2017-12-12
  • Android6.0獲取動態(tài)權限代碼示例

    Android6.0獲取動態(tài)權限代碼示例

    這篇文章主要介紹了Android6.0以上獲取動態(tài)權限代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Android中布局保存成圖片實例代碼

    Android中布局保存成圖片實例代碼

    本篇文章主要介紹了Android中布局保存成圖片實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Fiddler實現(xiàn)手機抓包之小白入門必看

    Fiddler實現(xiàn)手機抓包之小白入門必看

    這篇文章主要介紹了Fiddler實現(xiàn)手機抓包之小白入門必看篇,需要的朋友可以參考下
    2018-03-03
  • Android SpringAnimation彈性動畫解析

    Android SpringAnimation彈性動畫解析

    這篇文章主要為大家詳細介紹了Android SpringAnimation彈性動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

南充市| 连平县| 乌拉特后旗| 衡东县| 鄂伦春自治旗| 民乐县| 鸡东县| 长岭县| 大石桥市| 广丰县| 小金县| 惠东县| 通城县| 华坪县| 芷江| 海原县| 唐海县| 广西| 乌苏市| 阿合奇县| 大渡口区| 龙里县| 封丘县| 涟源市| 濮阳市| 栾城县| 玉门市| 稻城县| 兴化市| 镇原县| 新郑市| 宝清县| 和静县| 阆中市| 文水县| 同心县| 柳江县| 普陀区| 恩平市| 常熟市| 措美县|