精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

向用戶動態申請授權

系統 OpenHarmony
Nothing theoretical can be clearer than the code. 本期筆者將以一個Demo為例,與讀者們共同探討在ArkUI的框架中如何實現動態申請授權的功能。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

前言

應用向用戶動態申請授權,是指在用戶使用應用的過程中,應用方會根據應用場景和業務向用戶動態地請求相應的權限。例如,當應用需要訪問用戶的相機或麥克風時,會向用戶彈出一個授權請求框,詢問用戶是否允許應用訪問這些設備,而用戶可以選擇允許或拒絕此次授權請求。這種方式可以提高應用的安全性,在一定程度上保護用戶的隱私信息安全。

Nothing theoretical can be clearer than the code.  本期筆者將以一個Demo為例,與讀者們共同探討在ArkUI的框架中如何實現動態申請授權的功能

正文

通常情況下,一些提供基礎功能的權限可以通過靜態的方式獲取(即直接將開發者需要的權限在模塊級別的module.json5文件中聲明),如聯網權限。而對于一些能夠為應用提供用戶的隱私數據的敏感權限,則需要以動態的方式可視化地向用戶申請。本期的Demo以申請獲取大致位置權限(即"ohos.permission.APPROXIMATELY_LOCATION")為例,實現動態申請權限的功能。

新建工程

打開DevEco Studio(開發工具的版本必須支持API9),創建一個新的project,相關勾選如下

在module.json5中添加相應的權限

成功創建工程后,在工程文件目錄中打開目錄:entry/src/main/module.json5, 添加兩個權限——定位權限( "ohos.permission.LOCATION")和獲取大致位置的權限("ohos.permission.APPROXIMATELY_LOCATION" )。

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",

    //添加模塊所需的相關權限
    "requestPermissions": [
      {
        "name": "ohos.permission.APPROXIMATELY_LOCATION",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse"
        }
      },
      {
        "name": "ohos.permission.LOCATION",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse"
        }
      },
    ],
    
    ......

  }
}

事實上,當應用同時獲取以上兩種權限后,應用可以獲取設備的精準位置,精準度在米級別。

集成功能模塊

要實現向用戶動態申請授權的功能,我們需要制作兩個功能模塊,分別是檢查是否已獲得所需權限的功能和向用戶發起權限申請的功能。為了達到公共調用和功能模塊化,我們需要將這兩個功能模塊集成到兩個不同的TypeScript文件中,并將可調用接口導出。

在ets文件夾下新建目錄,并將其命名為Service。

在Service目錄下新建兩個TypeScript文件(右鍵Service目錄,選擇新建,再選擇TypeScript),分別命名為Detector與Applicant。

在編輯器中打開Detector.ts,加入以下代碼以集成檢查應用是否已獲得所需權限的功能,各代碼塊的具體功能已寫注解

//導入程序訪問控制管理模塊
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';

//導入包管理模塊
import bundleManager from '@ohos.bundle.bundleManager';

///定義待檢測的權限列表
const permissionsList: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION']     //權限數據的列表

//模塊的日志標簽
const TAG = '------[Detector] '

const APPROVAL:number = 0

//默認導出的模塊接口
export default async function Check_Access(){

  //創建AtManager實例
  let atManager = abilityAccessCtrl.createAtManager()

  //定義局部變量grantStatus
  let grantStatus:abilityAccessCtrl.GrantStatus

  //定義局部變量tokenId
  let tokenId:number

  try{

    //等待包管理模塊獲取本模塊所在的包的BundleInfo
    let bundleInfo:bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    //獲取上述BundleInfo中攜帶的ApplicationInfo
    let appInfo:bundleManager.ApplicationInfo = bundleInfo.appInfo
    //獲上述ApplicationInfo攜帶的accessTokenId
    tokenId = appInfo.accessTokenId
    
  }catch (err){
    console.error(TAG+`getBundleInfoForSelf failed, code is ${err.code}, message is ${err.message}`)
  }

  try{
    //利用AManager實例檢查是否已獲得所需權限
    grantStatus = await atManager.checkAccessToken(tokenId,permissionsList[0])
  }catch (err){
    console.error(TAG+`checkAccessToken failed, code is ${err.code}, message is ${err.message}`)
  }

  //根據不同的檢查結果做不同的輸出
  if(grantStatus == APPROVAL){
    console.info(TAG+'Accessible')
    return true
  }else {
    console.error(TAG+'Inaccessible')
    return false
  }

}

因為筆者已給代碼添加了注釋,所以筆者就不對這個模塊做太多啰嗦的分析了。這個模塊的大致執行邏輯是,通過調用系統能力@ohos.bundle.bundleManager獲取本包的accessTokenId,再調用系統能力@ohos.abilityAccessCtrl,在傳入accessTokenId和權限列表的條件下檢查module是否已獲取權限列表中的每個權限。當atManager的異步方法checkAccessToken返回結果為0時,表示所需權限均已被提供。

在編輯器中打開Applicant.ts,加入以下代碼以集成向用戶發起權限申請的功能,各代碼塊的具體功能已寫注解。

//導入程序訪問控制管理模塊
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'

//導入common
import common from '@ohos.app.ability.common';

//定義待動態申請的權限列表
const permissionsList: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION']

const APPROVAL:number = 0

//模塊的日志標簽
const TAG = '------[Applicant] '

//默認導出的模塊接口
export default async function Request_Permission_From_Users(context:common.UIAbilityContext){

  //預定義函數執行結果的狀態
  let isFinished:boolean = false

  //創建AtManager實例
  let atManager = abilityAccessCtrl.createAtManager()

  //等待程序訪問控制模塊完成權限請求的異步操作,完成后根據返回結果執行then()或catch()
  await atManager.requestPermissionsFromUser(context, permissionsList).then((result)=>{

    //將API返回的數據存儲到變量grantStatus中
    let grantStatus: Array<number> = result.authResults

    //判斷用戶是否提供所有相關權限
    for(let i = 0 ; i < grantStatus.length ; i++){
      if(grantStatus[i] === APPROVAL){   //用戶提供所有權限, ===指的是全等
        console.info(TAG+'Succeed! Obtain all the permissions')
        isFinished = true   //將函數執行結果的狀態設置為true
      }else{   //用戶未提供所有權限
        console.error(TAG+'User denies providing the permissions')
      }
    }
  }).catch((err)=>{
    console.error(TAG+`Request permission failed, code is ${err.code}, message is ${err.message}`)
  })

  return isFinished

}

這個模塊的大致執行邏輯是,在atManager的異步方法requestPermissionsFromUser

中傳入所需的上下文對象和待申請權限列表,并等待其異步過程的結束。在requestPermissionsFromUser的異步過程中,系統會彈出選擇框,詢問用戶是否提供權限。當用戶點擊選擇框中的允許或禁止時,權限會被授予或否,異步過程隨即結束(此處指的是申請單個權限的場景),requestPermissionsFromUser將申請結果以number型數組的形式輸出。當此數組中的每個元素的值都為0時,表示所有權限都成功獲得,否則,用戶拒絕授權了至少一個權限。

Detector.ts和Applicant.ts均默認導出了接口,想要在其他地方調用它們的功能,只需導入接口即可。

編輯頁面UI

添加圖片資源

在工程文件目錄中打開目錄:src/main/resources/rawfile, 添加兩張任意的圖片(可以在IDE中將待添加的圖片資源直接粘貼至rawfile目錄下,也可以在文件資源管理器中通過文件路徑打開rawfile目錄并添加圖片資源),分別命名為image1和image2。當然,圖片的格式沒有要求,只要在之后的步驟中能被正確引用即可。

設計頁面UI

打開Index.ts,刪除原有的Text組件,新增兩個Button組件和一個Image組件(相關屬性設置如下),并聲明一個用@state修飾的布爾變量ifAccessible。

@Entry
@Component
struct Index {

  //將應用是否獲取權限這條信息用布爾型變量ifAccessible儲存
  @State ifAccessible:boolean = false

  build() {
    Row() {
      Column() {

        //添加兩個Button組件和一個Image組件

        //條件渲染Image組件
        if(this.ifAccessible){
          Image($rawfile('image2.png'))
            .height(200)
            .width(200)
        }else{
          Image($rawfile('image1.png'))
            .height(200)
            .width(200)
        }

				//第一個Button組件
        Button('檢查應用是否獲得權限')
          .fontSize(20)
          .width('70%')
          .margin({
            top:40
          })
          .backgroundColor(Color.Pink)

				//第二個Button組件
        Button('向用戶動態申請權限')
          .fontSize(20)
          .width('70%')
          .margin({
            top:20
          })
          .backgroundColor(Color.Pink)

      }
      .width('100%')
    }
    .height('100%')
  }
}

預覽器效果如下:


添加自定義彈窗

首先,在組件Index之外用struct聲明一個新的自定義組件dialog,并用裝飾器@CustomDialog對其進行修飾,使dialog擁有成為自定義彈窗的能力。接著,我們對彈窗顯示的內容進行自定義設置,在build函數中加入自定義UI聲明。其中,CustomDialogController類型的成員變量controller和字符串類型成員變量message皆必不可少,后者可用于對dialog的外部傳參。

之后,我們在組件Index中new兩個彈窗控制器( CustomDialogController類的實例),并分別將它們賦予兩個私有成員變量(dialogController_Accessible和dialogController_Inaccessible)以供調用。當然,我們是用兩個message不同的dialog組件來構造這兩個彈窗控制器的,所以彈窗控制器dialogController_Accessible和彈窗控制器dialogController_Inaccessible可用于打開和關閉它們所對應的dialog。

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

 	......

  //new兩個彈窗控制器
  private dialogController_Accessible : CustomDialogController = new CustomDialogController({
    builder:dialog({
      message:'暫未獲取權限'
    })
  })

  private dialogController_Inaccessible : CustomDialogController = new CustomDialogController({
    builder:dialog({
      message:'已獲取權限'
    })
  })




  build() {
		......
	}
  
}

//自定義彈窗
@CustomDialog
struct dialog{

  controller:CustomDialogController

  @State message:string = ''

  build(){
    Column() {
      Text(this.message)
        .fontSize(20)
        .height(40)
        .fontColor(Color.White)
    }
    .width('100%')
    .backgroundColor(Color.Gray)
  }

}

編寫回調方法

首先,我們從先前步驟中已集成的功能模塊Detector導入異步函數Check_Access,并自定義異步方法detect。在detect的方法體中,我們通過關鍵字await等待異步過程,這意味者原本的異步任務變成了一個等價的延時同步任務,保證了detect中操作語句的順序執行。由于關鍵字await只能在異步方法或異步函數中出現,所以detect必須是異步方法。根據Check_Access的不同返回結果(成功或失敗),系統會生成不同內容的彈窗與用戶交互。detect()編寫完后,我們在用于檢查應用是否獲得權限的Button組件的onclick事件中加入此異步方法。

import Check_Access from 'ets/Service/Detector'  //從模塊Detector中導入異步函數Check_Access

@Entry
@Component
struct Index {
  
  .....

  //編寫異步方法detect,調用之前已寫好的模塊文件Detector
  async detect(){
    let res = await Check_Access()
    this.ifAccessible = res
    if(res){
      this.dialogController_Accessible.open()
    }else{
      this.dialogController_Inaccessible.open()
    }

  }

	......


  build() {
    Row() {
      Column() {

				......


        Button('檢查應用是否獲得權限')
          .fontSize(20)
          .width('70%')
          .margin({
            top:40
          })
          .backgroundColor(Color.Pink)
          //設置onclick回調,并調用異步函數detect()
          .onClick(()=>{
            this.detect()
          })


			......

      }
      .width('100%')
    }
    .height('100%')
  }
}

......

接著,我們從先前步驟中已集成的功能模塊Applicant中導入異步函數Request_Permission_From_Users,并導入common。隨后,我們通過getContext方法獲取上下文對象,并將其轉化為UIAbilityContext類型,存入私有成員變量context中。之后,自定義異步方法apply,在方法體中將成員變量context傳入異步函數Request_Permission_From_Users中。這樣以后,我們便可在用于向用戶動態申請權限的Button組件的onclick事件中加入自定義方法apply了。

......
import Request_Permission_From_Users from 'ets/Service/Applicant'
import common from '@ohos.app.ability.common'

@Entry
@Component
struct Index {
	
  ......

  //獲取上下文對象, 儲存在成員變量context中
  private context = getContext(this) as common.UIAbilityContext

  //編寫異步方法,調用之前已寫好的模塊文件Applicant
  async apply(){
    let res = await Request_Permission_From_Users(this.context)
    this.ifAccessible = res
    if(res){
      this.dialogController_Accessible.open()
    }else{
      this.dialogController_Inaccessible.open()
    }
  }
	......
  build() {
    Row() {
      Column() {
        ......
        Button('向用戶動態申請權限')
          .fontSize(20)
          .width('70%')
          .margin({
            top:20
          })
          .backgroundColor(Color.Pink)
          //設置onclick回調,并調用異步函數apply()
          .onClick(()=>{
            this.apply()
          })

      }
      .width('100%')
    }
    .height('100%')
  }
}

......

至此,本期的Demo完成了。

真機&模擬機調試

Demo完成之后,我們需要用模擬器或真機來運行以查看效果。

事實上,變量ifAccessible的值應該保存在本地的數據庫里,這樣每次重新創建此Demo的頁面實例時,才能正確地顯示對應圖像,讀者們可以自行修復這個bug。

當然,我們也可以打開日志欄,通過日志信息觀察功能模塊的運行。打開編輯器下方的Hilog,勾選'show only js log',并在標簽篩選欄中輸入0FEFE,過濾后的日志信息如下。

文章相關附件可以點擊下面的原文鏈接前往下載:

https://ost.51cto.com/resource/3052

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2024-07-09 08:48:38

2013-12-10 11:07:06

OpenStack面向用戶

2011-05-04 17:00:54

2009-04-09 09:16:19

微軟失誤緊急聲明

2018-04-02 10:54:56

2021-09-15 23:28:20

開源項目Jetbrains

2013-10-30 10:47:32

2011-05-03 10:37:51

亞馬遜網絡托管

2013-07-05 13:33:37

安全補丁

2015-07-28 10:26:03

Windows 10自動更新

2010-11-29 15:39:28

2009-04-14 08:48:37

微軟IE8瀏覽器

2010-03-04 09:45:52

2013-03-19 10:15:43

Windows 7

2010-02-23 09:55:52

Windows 7主題

2022-01-19 10:34:46

數據泄露網絡欺詐

2013-04-22 09:41:02

垃圾短信

2020-07-27 07:41:23

Linux重定向數據流

2019-08-16 17:09:34

2018-06-08 18:00:22

數據安全數據庫安全昂楷科技
點贊
收藏

51CTO技術棧公眾號

国产农村妇女毛片精品久久莱园子| 欧美精品影院| 亚洲国产精品国自产拍av| 国产精品男人爽免费视频1| www.5588.com毛片| 美日韩黄色大片| 欧美色图片你懂的| 黄色成人在线看| 9色在线视频| 国产不卡免费视频| 国产脚交av在线一区二区| 翔田千里88av中文字幕| 丝袜美腿综合| 日韩视频一区二区三区 | 午夜欧美精品久久久久久久| 欧美精品一区二区三区很污很色的| 成人在线看视频| 在线观看a级片| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲综合在线播放| 亚洲色成人www永久网站| 欧美国产精品| 日韩视频一区在线| 干b视频在线观看| 好吊妞视频这里有精品| 91精品免费观看| 亚洲熟女乱色一区二区三区| 四虎亚洲成人| 亚洲欧美综合色| 日韩理论片在线观看| 二区三区在线视频| 紧缚捆绑精品一区二区| 国产精品久久久久久久久久久久 | 嫩草香蕉在线91一二三区| 91亚洲永久精品| 肥熟一91porny丨九色丨| 国产又粗又长又大视频| 视频一区视频二区中文字幕| 91成人性视频| 日本网站在线播放| 在线观看一区| 欧美精品久久久久a| 亚洲精品卡一卡二| 91精品国产91久久综合| 色偷偷av一区二区三区| 国产sm调教视频| av在线不卡顿| 国产亚洲精品久久久久动| 黄色短视频在线观看| 欧美调教网站| 日韩激情视频在线| 日本免费福利视频| 丝袜连裤袜欧美激情日韩| 精品无人国产偷自产在线| 精品国产av色一区二区深夜久久 | 黑人巨大亚洲一区二区久 | 欧美激情视频在线| 久久久久人妻一区精品色欧美| 伊人成综合网| 欧美极品欧美精品欧美视频 | 欧美日韩中文字幕一区| 国内自拍视频网| 日韩制服一区| 欧美探花视频资源| 亚洲色图偷拍视频| 国产精品久久久久久久久久久久久久久 | 一级黄色大片网站| 精品无码三级在线观看视频| 亚洲在线观看视频网站| 亚洲第一黄色片| 99免费精品在线| 欧美视频小说| 亚洲图片88| 亚洲黄色录像片| 国产一二三在线视频| 亚洲美女炮图| 欧美色图12p| 天堂网成人在线| 欧美绝顶高潮抽搐喷水合集| 亚洲美女黄色片| 中文字幕第69页| 欧美欧美全黄| 琪琪第一精品导航| 91麻豆成人精品国产| 国产成人啪午夜精品网站男同| 黄色国产精品一区二区三区| 男人天堂资源在线| 1024成人网| 青娱乐自拍偷拍| 99久久精品一区二区成人| 欧美人与z0zoxxxx视频| 国产又黄又嫩又滑又白| 免费福利视频一区| 最近免费中文字幕视频2019| 免费一级片视频| 99精品热视频只有精品10| 国产精品xxx视频| 国产美女www爽爽爽视频| 成人av电影在线播放| 亚洲电影一二三区| 第一av在线| 欧美日韩精品一区二区在线播放| 韩国黄色一级片| 欧洲杯足球赛直播| 粗暴蹂躏中文一区二区三区| 日韩美女视频网站| 久久99精品国产麻豆婷婷 | av一区二区高清| 欧美激情综合色| 91片黄在线观看喷潮| 99久久国产综合精品麻豆| 综合视频在线观看| 成人香蕉视频| 精品日韩一区二区三区| 日本综合在线观看| 午夜亚洲性色视频| 成人91免费视频| av大片在线观看| 精品色蜜蜜精品视频在线观看| 成年人三级黄色片| 久久最新网址| 欧美在线免费看| 四虎免费在线观看| 一区二区三区四区亚洲| 最新天堂在线视频| 国内精品久久久久久99蜜桃| 久久久久久伊人| av网站在线免费看| 国产精品久久久久一区 | 欧美亚韩一区二区三区| 国产精品综合av一区二区国产馆| 日韩亚洲视频在线| 我爱我色成人网| 精品视频www| 日韩av一区二区在线播放| 精品一区二区三区免费毛片爱| 日韩精品欧美在线| 色老太综合网| 亚洲欧洲av一区二区| 国产香蕉视频在线| 99精品国产视频| 国产免费黄色小视频| 国产精品白丝一区二区三区| 欧美精品情趣视频| 国产精品欧美综合亚洲| 最新日韩av在线| 国产高清av片| 伊人久久大香线| 99精彩视频| 成人性生交大片免费看网站| 日韩三级在线免费观看| 亚洲欧美精品aaaaaa片| 激情欧美一区二区| 成人午夜免费剧场| 精品视频一区二区三区| 色综合老司机第九色激情 | 久久精品国产福利| 麻豆成人在线看| 亚洲国产av一区二区| 亚洲午夜视频在线| 午夜不卡久久精品无码免费| 一本久道久久综合狠狠爱| 久久精品一二三区| 欧美va在线观看| 久久视频国产精品免费视频在线| 国产偷拍一区二区| 亚洲成人一区二区| 美女100%无挡| 免费的国产精品| 99re6这里有精品热视频| 大奶在线精品| 欧美最近摘花xxxx摘花| 免费观看成人高潮| 欧美va亚洲va| www.国产毛片| 亚洲欧洲精品天堂一级| 亚洲精品久久一区二区三区777| 宅男噜噜噜66一区二区| 亚洲春色综合另类校园电影| 亚洲精品在线国产| 热门国产精品亚洲第一区在线| av播放在线观看| 91麻豆精品国产91久久久久久| 全程偷拍露脸中年夫妇| 91在线一区二区| 日本不卡一区二区在线观看| 亚洲高清二区| 亚洲三区视频| 欧美黄色影院| 91色精品视频在线| 最新中文字幕在线播放| 久久天天躁狠狠躁夜夜躁| 污视频网站免费观看| 欧美色国产精品| 精品一区免费观看| 国产精品国产自产拍高清av| 成年人小视频在线观看| 蜜桃视频一区二区| 国产91在线视频观看| 中文字幕午夜精品一区二区三区| 免费中文日韩| av动漫精品一区二区| 国产在线观看91精品一区| 国产理论在线| 久久精品精品电影网| 青青草免费观看免费视频在线| 欧美精品1区2区3区| 国产精品视频123| 一区二区三区中文在线观看| 中文字幕伦理片| 91麻豆精东视频| 亚洲婷婷在线观看| 国产麻豆一精品一av一免费 | 亚洲天堂免费观看| 欧美视频xxx| 欧美一级高清大全免费观看| 波多野结衣在线观看一区| 亚洲成人你懂的| 欧美成欧美va| 国产精品入口麻豆九色| 97人妻精品一区二区免费| k8久久久一区二区三区| 日本wwww色| 韩国欧美国产1区| 亚洲欧美视频二区| 日韩国产精品久久久| www黄色日本| 亚洲精品裸体| 国产卡一卡二在线| 国产精品7m凸凹视频分类| 日韩中文字幕一区| 国产真实有声精品录音| 日本成人黄色免费看| 色爱av综合网| 久久天堂国产精品| 日韩欧美天堂| 九色视频成人porny| 开心激情综合| 国产一区免费视频| 欧美人妖视频| 久久久久久亚洲精品不卡4k岛国| 国产厕拍一区| 国产亚洲二区| 色综合久久中文| 日本一区精品| 欧美日韩性在线观看| 欧日韩一区二区三区| 国产不卡一二三区| 日韩高清av电影| 成人在线电影在线观看视频| 亚洲欧美精品在线观看| 色喇叭免费久久综合网| 亚洲欧美国产精品桃花| 欧美久久综合网| 中文字幕久久综合| 欧美在线首页| 免费av手机在线观看| 亚洲尤物影院| 国产自偷自偷免费一区| 久久国产乱子精品免费女| 爱爱爱爱免费视频| 国产成a人亚洲| 青青草成人免费视频| 久久你懂得1024| 羞羞在线观看视频| 亚洲一区二区三区四区在线观看 | 日韩成人伦理| 国外成人免费在线播放| 亚洲欧美电影| 国产精品手机播放| 久久影院一区二区三区| 国产成人女人毛片视频在线| 天堂精品在线视频| 韩日午夜在线资源一区二区| 国产欧美日韩在线观看视频| 亚洲精品成人三区| 一区二区影院| 韩国一区二区av| 久久99精品久久久久久国产越南 | 久热精品视频在线观看一区| 51xtv成人影院| 91成品人片a无限观看| 欧美一级做a| 国产欧美日韩综合一区在线观看| 久久99国内| 300部国产真实乱| 亚洲一区二区三区四区五区午夜| 一女二男3p波多野结衣| 粉嫩欧美一区二区三区高清影视| 人妻aⅴ无码一区二区三区| 亚洲免费在线视频一区 二区| 91看片在线播放| 欧美精品久久一区| 日本天堂在线| 欧美成人免费小视频| 二吊插入一穴一区二区| 97人人澡人人爽| 欧美手机视频| www.99热这里只有精品| 久久99日本精品| www.久久国产| 亚洲综合另类小说| 中文字幕视频在线播放| 日韩av在线精品| 操你啦视频在线| 国产精品一区二区女厕厕| 激情av综合| 国产精品无码免费专区午夜| 日韩成人dvd| asian性开放少妇pics| 一区二区三区精品在线| 精品国产青草久久久久96| 亚洲精品久久久久久久久| a视频在线播放| 国产精品午夜视频| 猛男gaygay欧美视频| 国产在线播放观看| 国产精品一区二区黑丝| 日本成人免费在线观看| 色综合激情久久| 国产精品国产高清国产| 欧美大秀在线观看| 国产色99精品9i| 亚洲精品美女久久7777777| 模特精品在线| 国产肉体xxxx裸体784大胆| 亚洲资源中文字幕| 国产成a人亚洲精v品无码| 日韩视频在线免费| 亚洲黑人在线| 中文字幕色一区二区| 蜜臀久久99精品久久久画质超高清| 熟女俱乐部一区二区视频在线| 五月激情综合婷婷| 噜噜噜久久,亚洲精品国产品| 九色成人免费视频| 精品国产不卡一区二区| 黄色一级视频播放| 国产激情一区二区三区桃花岛亚洲| 成人信息集中地| 欧美剧在线免费观看网站 | 亚洲美女视频在线| 99国产在线播放| 欧美成人四级hd版| 亚洲日本va| 丰满少妇大力进入| 成人av网站免费| 久久久久99精品成人片我成大片| 亚洲欧美国产视频| 日韩一区二区三区免费视频| 日日夜夜精品网站| 久久国产夜色精品鲁鲁99| 精品国产国产综合精品| 6080午夜不卡| 图片区小说区亚洲| 国产成人精品免费视频大全最热| 尤物精品在线| 日韩一级视频在线观看| 欧美日韩综合视频网址| 国产露出视频在线观看| 国产精品视频免费观看www| 久久美女精品| 性一交一黄一片| 婷婷综合在线观看| 国产女主播在线直播| 国产日韩在线一区| 国产精品v亚洲精品v日韩精品 | 国内揄拍国内精品少妇国语| 欧美中文一区| 尤蜜粉嫩av国产一区二区三区| 1000部国产精品成人观看| 亚洲欧美激情另类| 日本成人激情视频| 999久久久精品国产| 精品无码av一区二区三区| 欧美日韩免费在线观看| 国产爆初菊在线观看免费视频网站| 91免费欧美精品| 一本色道久久综合亚洲精品不| 在线不卡av电影| 欧美一区二区三区四区五区| heyzo一区| 亚洲日本一区二区三区在线不卡| 国产美女视频一区| 久久久久久不卡| 久久亚洲一区二区三区四区五区高| 911亚洲精品| 艹b视频在线观看| 亚洲一级二级三级| 自拍视频在线| 国产一区二区视频在线免费观看 | 国产精品vip| 色屁屁草草影院ccyy.com| 欧美刺激脚交jootjob| 国模一区二区| 成人午夜视频在线观看免费| 国产精品视频在线看| 六月婷婷综合网| 91免费精品国偷自产在线| 久久裸体视频|