黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

Android運行時權限終極方案(PermissionX)

瀏覽:150日期:2022-09-24 10:48:56

各位小伙伴們大家早上好,不知道你的《第三行代碼》已經讀到哪里了?

有些朋友的閱讀速度真是令人印象深刻,我記得在《第三行代碼》剛剛發售一周不到的時間里,竟然就有人已經讀到第9章了(因為公眾號后臺有人回復第9章里隱藏的關鍵字)。現在,《第三行代碼》已經出版一個月有余了,相信已經有不少朋友將全本書都看完了。

全書都看完的朋友一定知道,《第三行代碼》的最后一章是帶著大家一起開發了一個開源庫:PermissionX。這一章的主旨是為了讓你了解一個開源庫整體的開發與發布過程,為了更好地演示這個過程,我想到了去寫PermissionX這樣一個庫。

不過,書中PermissionX庫的整體功能還是比較簡單的,因為這一章的重點不在于如何將開源庫做得完善與強大,而是強調的一個開發與發布的過程。

但是后來,我覺得PermissionX確實可以做成一個真正用于簡化Android運行時權限處理的庫,它所存在的意義應該不僅限于書中的教學目的,而是可以真的應用到實際的項目當中,幫助大家解決處理運行時權限的痛點。

所以,后期我又對PermissionX進行了諸多功能拓展,現在已經達到對外發布的標準了,那么今天正式向大家宣布:PermissionX已經上線!

源碼庫地址是:https://github.com/guolindev/PermissionX

痛點在哪里?

沒有人愿意編寫處理Android運行時權限的代碼,因為它真的太繁瑣了。

這是一項沒有什么技術含量,但是你又不得不去處理的工作,因為不處理它程序就會崩潰。但如果處理起來比較簡單也就算了,可事實上,Android提供給我們的運行時權限API并不友好。

以一個撥打電話的功能為例,因為CALL_PHONE權限是危險權限,所以在我們除了要在AndroidManifest.xml中聲明權限之外,還要在執行撥打電話操作之前進行運行時權限處理才行。

權限聲明如下:

<manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.permissionx.app'> <uses-permission android:name='android.permission.CALL_PHONE' />...</manifest>

然后,編寫如下代碼來進行運行時權限處理:

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) makeCallBtn.setOnClickListener { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {call() } else {ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1) } } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { 1 -> {if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { call()} else { Toast.makeText(this, 'You denied CALL_PHONE permission', Toast.LENGTH_SHORT).show()} } } } private fun call() { try { val intent = Intent(Intent.ACTION_CALL) intent.data = Uri.parse('tel:10086') startActivity(intent) } catch (e: SecurityException) { e.printStackTrace() } }}

這段代碼中真有正意義的功能邏輯就是call()方法中的內容,可是如果直接調用call()方法是無法實現撥打電話功能的,因為我們還沒有申請CALL_PHONE權限。

那么整段代碼其他的部分就都是在處理CALL_PHONE權限申請。可以看到,這里需要先判斷用戶是否已授權我們撥打電話的權限,如果沒有的話則要進行權限申請,然后還要在onRequestPermissionsResult()回調中處理權限申請的結果,最后才能去執行撥打電話的操作。

你可能覺得,這也不算是很繁瑣呀,代碼量并不是很多。那是因為,目前我們還只是處理了運行時權限最簡單的場景,而實際的項目環境中有著更加復雜的場景在等著我們。

比如說,你的App可能并不只是單單申請一個權限,而是需要同時申請多個權限。雖然ActivityCompat.requestPermissions()方法允許一次性傳入多個權限名,但是你在onRequestPermissionsResult()回調中就需要判斷哪些權限被允許了,哪些權限被拒絕了,被拒絕的權限是否影響到應用程序的核心功能,以及是否要再次申請權限。

而一旦牽扯到再次申請權限,就引出了一個更加復雜的問題。你申請的權限被用戶拒絕過了一次,那么再次申請將很有可能再次被拒絕。為此,Android提供了一個shouldShowRequestPermissionRationale()方法,用于判斷是否需要向用戶解釋申請這個權限的原因,一旦shouldShowRequestPermissionRationale()方法返回true,那么我們最好彈出一個對話框來向用戶闡明為什么我們是需要這個權限的,這樣可以增加用戶同意授權的幾率。

是不是已經覺得很復雜了?不過還沒完,Android系統還提供了一個“拒絕,不要再詢問”的選項,如下圖所示:

Android運行時權限終極方案(PermissionX)

只要用戶選擇了這個選項,那么我們以后每次執行權限申請的代碼都將會直接被拒絕。

可是如果我的某項功能就是必須要依賴這個權限才行呢?沒有辦法,你只能提示用戶去應用程序設置當中手動打開權限,程序方面已無法進行操作。

可以看出,如果想要在項目中對運行時權限做出非常全面的處理,是一件相當復雜的事情。事實上,大部分的項目都沒有將權限申請這塊處理得十分恰當,這也是我編寫PermissionX的理由。

PermissionX的實現原理

在開始介紹PermissionX的具體用法之前,我們先來討論一下它的實現原理。

其實之前并不是沒有人嘗試過對運行時權限處理進行封裝,我之前在做直播公開課的時候也向大家演示過一種運行時權限API的封裝過程。

但是,想要對運行時權限的API進行封裝并不是一件容易的事,因為這個操作是有特定的上下文依賴的,一般需要在Activity中接收onRequestPermissionsResult()方法的回調才行,所以不能簡單地將整個操作封裝到一個獨立的類中。

為此,也衍生出了一系列特殊的封裝方案,比如將運行時權限的操作封裝到BaseActivity中,或者提供一個透明的Activity來處理運行時權限等。

不過上述兩種方案都不夠輕量,因為改變Activity的繼承結構這可是大事情,而提供一個透明的Activty則需要在AndroidManifest.xml中進行額外的聲明。

現在,業內普遍比較認可使用另外一種小技巧來進行實現。是什么小技巧呢?回想一下,之前所有申請運行時權限的操作都是在Activity中進行的,事實上,Android在Fragment中也提供了一份相同的API,使得我們在Fragment中也能申請運行時權限。

但不同的是,Fragment并不像Activity那樣必須有界面,我們完全可以向Activity中添加一個隱藏的Fragment,然后在這個隱藏的Fragment中對運行時權限的API進行封裝。這是一種非常輕量級的做法,不用擔心隱藏Fragment會對Activity的性能造成什么影響。

這就是PermissionX的實現原理了,書中其實也已經介紹過了這部分內容。但是,在其實現原理的基礎之上,后期我又增加了很多新功能,讓PermissionX變得更加強大和好用,下面我們就來學習一下PermissionX的具體用法。

基本用法

要使用PermissionX之前,首先需要將其引入到項目當中,如下所示:

dependencies {...implementation ’com.permissionx.guolindev:permissionx:1.1.1’}

我在寫本篇文章時PermissionX的最新版本是1.1.1,想要查看它的當前最新版本,請訪問PermissionX的主頁:https://github.com/guolindev/PermissionX

PermissionX的目的是為了讓運行時權限處理盡可能的容易,因此怎么讓API變得簡單好用就是我優先要考慮的問題。

比如同樣實現撥打電話的功能,使用PermissionX只需要這樣寫:

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) makeCallBtn.setOnClickListener { PermissionX.init(this).permissions(Manifest.permission.CALL_PHONE).request { allGranted, grantedList, deniedList -> if (allGranted) { call() } else { Toast.makeText(this, '您拒絕了撥打電話權限', Toast.LENGTH_SHORT).show() }} } } ...}

是的,PermissionX的基本用法就這么簡單。首先調用init()方法來進行初始化,并在初始化的時候傳入一個FragmentActivity參數。由于AppCompatActivity是FragmentActivity的子類,所以只要你的Activity是繼承自AppCompatActivity的,那么直接傳入this就可以了。

接下來調用permissions()方法傳入你要申請的權限名,這里傳入CALL_PHONE權限。你也可以在permissions()方法中傳入任意多個權限名,中間用逗號隔開即可。

最后調用request()方法來執行權限申請,并在Lambda表達式中處理申請結果。可以看到,Lambda表達式中有3個參數:allGranted表示是否所有申請的權限都已被授權,grantedList用于記錄所有已被授權的權限,deniedList用于記錄所有被拒絕的權限。

因為我們只申請了一個CALL_PHONE權限,因此這里直接判斷:如果allGranted為true,那么就調用call()方法,否則彈出一個Toast提示。

運行結果如下:

Android運行時權限終極方案(PermissionX)

怎么樣?對比之前的寫法,是不是覺得運行時權限處理沒那么繁瑣了?

核心用法

然而我們目前還只是處理了最普通的場景,剛才提到的,假如用戶拒絕了某個權限,在下次申請之前,我們最好彈出一個對話框來向用戶解釋申請這個權限的原因,這個又該怎么實現呢?

別擔心,PermissionX對這些情況進行了充分的考慮。

onExplainRequestReason()方法可以用于監聽那些被用戶拒絕,而又可以再次去申請的權限。從方法名上也可以看出來了,應該在這個方法中解釋申請這些權限的原因。

而我們只需要將onExplainRequestReason()方法串接到request()方法之前即可,如下所示:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE) .onExplainRequestReason { deniedList -> } .request { allGranted, grantedList, deniedList -> if (allGranted) { Toast.makeText(this, '所有申請的權限都已通過', Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, '您拒絕了如下權限:$deniedList', Toast.LENGTH_SHORT).show() } }

這種情況下,所有被用戶拒絕的權限會優先進入onExplainRequestReason()方法進行處理,拒絕的權限都記錄在deniedList參數當中。接下來,我們只需要在這個方法中調用showRequestReasonDialog()方法,即可彈出解釋權限申請原因的對話框,如下所示:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE) .onExplainRequestReason { deniedList -> showRequestReasonDialog(deniedList, '即將重新申請的權限是程序必須依賴的權限', '我已明白', '取消') } .request { allGranted, grantedList, deniedList -> if (allGranted) { Toast.makeText(this, '所有申請的權限都已通過', Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, '您拒絕了如下權限:$deniedList', Toast.LENGTH_SHORT).show() } }

showRequestReasonDialog()方法接受4個參數:第一個參數是要重新申請的權限列表,這里直接將deniedList參數傳入。第二個參數則是要向用戶解釋的原因,我只是隨便寫了一句話,這個參數描述的越詳細越好。第三個參數是對話框上確定按鈕的文字,點擊該按鈕后將會重新執行權限申請操作。第四個參數是一個可選參數,如果不傳的話相當于用戶必須同意申請的這些權限,否則對話框無法關閉,而如果傳入的話,對話框上會有一個取消按鈕,點擊取消后不會重新進行權限申請,而是會把當前的申請結果回調到request()方法當中。

另外始終要記得將所有申請的權限都在AndroidManifest.xml中進行聲明:

<manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.permissionx.app'> <uses-permission android:name='android.permission.READ_CONTACTS' /> <uses-permission android:name='android.permission.CAMERA' /> <uses-permission android:name='android.permission.CALL_PHONE' />...</manifest>

重新運行一下程序,效果如下圖所示:

Android運行時權限終極方案(PermissionX)

目前解釋權限申請原因對話框的樣式暫時還無法自定義,下個版本當中,我會加入自定義對話框樣式的功能。

當然,我們也可以指定要對哪些權限重新申請,比如上述申請的3個權限中,我認為CAMERA權限是必不可少的,而其他兩個權限則可有可無,那么在重新申請的時候也可以只申請CAMERA權限:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION) .onExplainRequestReason { deniedList -> val filteredList = deniedList.filter { it == Manifest.permission.CAMERA } showRequestReasonDialog(filteredList, '攝像機權限是程序必須依賴的權限', '我已明白', '取消') } .request { allGranted, grantedList, deniedList -> if (allGranted) { Toast.makeText(this, '所有申請的權限都已通過', Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, '您拒絕了如下權限:$deniedList', Toast.LENGTH_SHORT).show() } }

這樣當再次申請權限的時候就只會申請CAMERA權限,剩下的兩個權限最終會被傳入到request()方法的deniedList參數當中。

解決了向用戶解釋權限申請原因的問題,接下來還有一個頭疼的問題要解決:如果用戶不理會我們的解釋,仍然執意拒絕權限申請,并且還選擇了拒絕且不再詢問的選項,這該怎么辦?通常這種情況下,程序層面已經無法再次做出權限申請,唯一能做的就是提示用戶到應用程序設置當中手動打開權限。

那么PermissionX是如何處理這種情況的呢?我相信絕對會給你帶來驚喜。PermissionX中還提供了一個onForwardToSettings()方法,專門用于監聽那些被用戶永久拒絕的權限。另外從方法名上就可以看出,我們可以在這里提醒用戶手動去應用程序設置當中打開權限。代碼如下所示:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE) .onExplainRequestReason { deniedList -> showRequestReasonDialog(deniedList, '即將重新申請的權限是程序必須依賴的權限', '我已明白', '取消') } .onForwardToSettings { deniedList -> showForwardToSettingsDialog(deniedList, '您需要去應用程序設置當中手動開啟權限', '我已明白', '取消') } .request { allGranted, grantedList, deniedList -> if (allGranted) { Toast.makeText(this, '所有申請的權限都已通過', Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, '您拒絕了如下權限:$deniedList', Toast.LENGTH_SHORT).show() } }

可以看到,這里又串接了一個onForwardToSettings()方法,所有被用戶選擇了拒絕且不再詢問的權限都會進行到這個方法中處理,拒絕的權限都記錄在deniedList參數當中。

接下來,你并不需要自己彈出一個Toast或是對話框來提醒用戶手動去應用程序設置當中打開權限,而是直接調用showForwardToSettingsDialog()方法即可。類似地,showForwardToSettingsDialog()方法也接收4個參數,每個參數的作用和剛才的showRequestReasonDialog()方法完全一致,我這里就不再重復解釋了。

showForwardToSettingsDialog()方法將會彈出一個對話框,當用戶點擊對話框上的我已明白按鈕時,將會自動跳轉到當前應用程序的設置界面,從而不需要用戶自己慢慢進入設置當中尋找當前應用了。另外,當用戶從設置中返回時,PermissionX將會自動重新請求相應的權限,并將最終的授權結果回調到request()方法當中。效果如下圖所示:

Android運行時權限終極方案(PermissionX)

同樣,下個版本當中,我也會加入自定義這個對話框樣式的功能。

更多用法

PermissionX最主要的功能大概就是這些,不過我在使用一些App的時候發現,有些App喜歡在第一次請求權限之前就先彈出一個對話框向用戶解釋自己需要哪些權限,然后才會進行權限申請。這種做法是比較提倡的,因為用戶同意授權的概率會更高。

那么PermissionX中要如何實現這樣的功能呢?

其實非常簡單,PermissionX還提供了一個explainReasonBeforeRequest()方法,只需要將它也串接到request()方法之前就可以了,代碼如下所示:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE).explainReasonBeforeRequest() .onExplainRequestReason { deniedList -> showRequestReasonDialog(deniedList, '即將申請的權限是程序必須依賴的權限', '我已明白') } .onForwardToSettings { deniedList -> showForwardToSettingsDialog(deniedList, '您需要去應用程序設置當中手動開啟權限', '我已明白') } .request { allGranted, grantedList, deniedList -> if (allGranted) { Toast.makeText(this, '所有申請的權限都已通過', Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, '您拒絕了如下權限:$deniedList', Toast.LENGTH_SHORT).show() } }

這樣,當每次請求權限時,會優先進入onExplainRequestReason()方法,彈出解釋權限申請原因的對話框,用戶點擊我已明白按鈕之后才會執行權限申請。效果如下圖所示:

Android運行時權限終極方案(PermissionX)

不過,你在使用explainReasonBeforeRequest()方法時,其實還有一些關鍵的點需要注意。

第一,單獨使用explainReasonBeforeRequest()方法是無效的,必須配合onExplainRequestReason()方法一起使用才能起作用。這個很好理解,因為沒有配置onExplainRequestReason()方法,我們怎么向用戶解釋權限申請原因呢?

第二,在使用explainReasonBeforeRequest()方法時,如果onExplainRequestReason()方法中編寫了權限過濾的邏輯,最終的運行結果可能和你期望的會不一致。這一點可能會稍微有點難理解,我用一個具體的示例來解釋一下。

觀察如下代碼:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE).explainReasonBeforeRequest() .onExplainRequestReason { deniedList -> val filteredList = deniedList.filter { it == Manifest.permission.CAMERA } showRequestReasonDialog(filteredList, '攝像機權限是程序必須依賴的權限', '我已明白') } ...

這里在onExplainRequestReason()方法中編寫了剛才用到的權限過濾邏輯,當有多個權限被拒絕時,我們只重新申請CAMERA權限。

在沒有加入explainReasonBeforeRequest()方法時,一切都可以按照我們所預期的那樣正常運行。但如果加上了explainReasonBeforeRequest()方法,在執行權限請求之前會先進入onExplainRequestReason()方法,而這里將除了CAMERA之外的其他權限都過濾掉了,因此實際上PermissionX只會請求CAMERA這一個權限,剩下的權限將完全不會嘗試去請求,而是直接作為被拒絕的權限回調到最終的request()方法當中。

效果如下圖所示:

Android運行時權限終極方案(PermissionX)

針對于這種情況,PermissionX在onExplainRequestReason()方法中提供了一個額外的beforeRequest參數,用于標識當前上下文是在權限請求之前還是之后,借助這個參數在onExplainRequestReason()方法中執行不同的邏輯,即可很好地解決這個問題,示例代碼如下:

PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE).explainReasonBeforeRequest() .onExplainRequestReason { deniedList, beforeRequest -> if (beforeRequest) { showRequestReasonDialog(deniedList, '為了保證程序正常工作,請您同意以下權限申請', '我已明白') } else { val filteredList = deniedList.filter {it == Manifest.permission.CAMERA } showRequestReasonDialog(filteredList, '攝像機權限是程序必須依賴的權限', '我已明白') } } ...

可以看到,當beforeRequest為true時,說明此時還未執行權限申請,那么我們將完整的deniedList傳入showRequestReasonDialog()方法當中。

而當beforeRequest為false時,說明某些權限被用戶拒絕了,此時我們只重新申請CAMERA權限,因為它是必不可少的,其他權限則可有可無。

最終運行效果如下:

Android運行時權限終極方案(PermissionX)

Permission-Support

這個庫的名字叫PermissionX,因此不用多說,它肯定是與AndroidX兼容的。以防還有部分朋友不清楚AndroidX是什么的,這里有一篇我之前寫的科普文章 總是聽到有人說AndroidX,到底什么是AndroidX?

但是,我相信現在仍然存在很多項目沒有使用AndroidX,而是在繼續使用著之前的Android Support Library。為此,我又專門提供了一份面向Android Support Library的版本:Permission-Support。

在用法層面,兩個版本沒有任何區別,本文以上討論的所有內容在Permission-Support上都適用。只是在引用庫的時候,如果你準備使用Permission-Support,請使用以下依賴庫地址:

dependencies {...implementation ’com.permissionx.guolindev:permission-support:1.1.1’}

不過,Android Support Library注定將會在不久的將來被Google完全淘汰,因此Permission-Support我也不會維護太久的時間,只是暫時過渡一下。而PermissionX我是準備長期維護下去的,并會持續增加更多好用的新功能。

后記

最后,一定也會有朋友想要詢問,Java語言的項目能不能使用PermissionX呢?

其實早在最開始的時候,我是打算將PermissionX設計成Kotlin和Java都可以通用的一個庫。但是寫著寫著發現,如果想要兼容Java語言,需要放棄很多Kotlin的語法特性,這樣PermissionX用起來就不再是那么簡潔了,最終只好選擇了放棄Java語言的支持。

不過等PermissionX整體功能穩定下來之后,我可能會專門再編寫一個Java版的PermissionX。語法層面肯定要比Kotlin版的復雜不少,但是一定比你自己去處理運行時權限簡單得多。

新庫剛剛發布,可能還存在很多我自己沒能測出來的bug,也請大家幫忙多多測試,共同將這個庫變得更加完善。

再次貼上PermissionX的開源庫地址,歡迎大家star和fork。

https://github.com/guolindev/PermissionX

到此這篇關于Android運行時權限終極方案(PermissionX)的文章就介紹到這了,更多相關Android 運行時權限內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 日韩视频在线免费 | 欧美日韩精品一区二区天天拍 | 蜜臀va亚洲va欧美va天堂 | 无码东京热一区二区三区 | 国产免费麻豆 | 久久99热狠狠色一区二区 | 国产成人精品一二三区 | 中文字幕一精品亚洲无线一区 | 日本一区二区三区四区在线观看 | 亚洲国产成人久久精品软件 | 92精品国产成人观看免费 | 日韩一区二区在线视频 | 亚洲天堂久 | 亚洲一区二区三区日本 | 欧美乱大交做爰xxxⅹ性3 | 久久中文骚妇内射 | 国产一级做a爰片久久毛片男男 | 一进一出gif抽搐日本免费视频 | 午夜在线视频观看日韩17c | 成人无遮挡裸免费视频在线观看 | 精品国产乱码久久久久软件 | 一级片毛片 | 乱人伦中文视频在线 | 大吊日肥婆视频 | 中文无码日韩欧 | 99激情视频| 国产98在线 | 免费、 | 四虎影视亚洲精品一区二区 | 免费视频拗女稀缺一区二区 | 99精品视频一区二区三区 | av片免费观看 | 成人综合在线观看 | 一区二区三区av在线 | 欧美一区2区三区4区公司 | 日本a级网站 | 91精品国产综合久久香蕉最新版 | 熟妇人妻av无码一区二区三区 | 无尺码精品产品日韩 | 尤物一区 | 亚洲精品国| 91视频二区| 成人一区二区免费视频 | 国产山村乱淫老妇女视频 | 国产成a人亚洲精品在线观看 | 亚洲伦理在线观看 | 成人婷婷网色偷偷亚洲男人的天堂 | 欧美黑人一区二区三区 | 欧美色图偷窥自拍 | 亚洲一级一级 | 久久黄色小说 | 国产人与禽zoz0性伦在线 | 午夜精品久久久久久久久久 | 海量av| 久久久影院 | 国产女人与zoxxxx另类 | 午夜精品久久久久久久99黑人 | 日韩国产在线播放 | 少妇精品无码一区二区免费视频 | 国产精品一区二区免费看 | 人妻有码中文字幕 | 国产乱子伦视频一区二区三区 | 免费的黄色片 | 日日碰狠狠躁久久躁 | 绝顶高潮合集videos | 国产成人免费ā片在线观看 | 成人精品视频99在线观看免费 | 91精品国产综合久久久久久久久久 | 国产成人精品午夜福利在线观看 | 朝鲜大乳女奶水奶水吃奶视频在线 | 制服丝袜在线看 | 四虎影视永久在线观看 | 国产精品香蕉在线的人 | 国语对白做受69 | 国产欧美日韩综合精品一区二区 | 国产中文字幕二区 | 粉嫩av渣男av蜜乳av | 五月激情婷婷丁香综合基地 | 久久亚洲熟女cc98cm | 男人猛吃奶女人爽视频 | 国产黄色网页 | 欧美性久久 | 麻豆一区二区三区在线观看 | 欧美性折磨bdsm激情另类视频 | 国产香蕉97碰碰久久人人 | 在线观看免费人成视频色9 在线观看的网站 | 久久久99精品免费观看 | 国产精品无码久久久久久 | 日韩欧美在线播放 | 免费黄色一级视频 | 成年人免费网站在线观看 | 亚洲欧美精品 | 亚洲a视频在线观看 | 亚洲做受高潮软件 | 亚洲夜色噜噜av在线观看 | 欧美人与禽zoz0性伦交 | 欧美又粗又长又爽做受 | 日韩成人免费在线观看 | 国产在线精品一区二区在线看 | 亚洲综合av一区二区三区 | 亚洲精品成人网站在线观看 | 狠狠五月婷婷 | 性做久久久久久久久 | 综合网在线 | 色呦呦网站 | 最新av在线网站 | 56国语精品自产拍在线观看 | zzzwww在线看片免费 | 性乌克兰xxxx极品 | 欧美自拍偷拍第一页 | 乱亲女h秽乱长久久久 | 5g影院天天爽入口入口 | 真实的国产乱ⅹxxx66小说 | 国产91在线观看丝袜 | 亚洲天堂不卡 | 国产真实伦在线视频 | 亚洲国产婷婷香蕉久久久久久99 | 激情视频久久 | 成人午夜片av在线看 | 日韩精品91 | 色诱视频在线观看 | 女人的av| 女人av在线| 娇妻玩4p被三个男人伺候电影 | 永久免费无码网站在线观看 | 天天鲁一鲁摸一摸爽一爽 | 你懂的网址国产,欧美 | 国产又黄又猛又粗又爽的视频 | 亚洲午夜小视频 | 一本色综合 | 亚洲精品乱码久久久久久久久久 | 成人妇女淫片aaaa视频 | 国产95在线 | 岛国片免费在线观看 | 裸体丰满少妇做受久久99精品 | 成人免费观看网站 | 色操插| 成人动作片在线观看 | 黑人情欲在线播放 | 午夜精品免费看 | 日本久久久久久科技有限公司 | 精品国产一区二区三区不卡蜜臂 | 日日夜夜伊人 | 成人亚洲欧美成αⅴ人在线观看 | 伊人久久麻豆 | 夜夜高潮夜夜爽夜夜爱爱一区 | 国产精品毛片在线完整版 | 国产精品久久9 | 老熟妇高潮一区二区三区 | 日韩欧美中文字幕在线三区 | 国产小视频91 | 粉嫩av一区二区三区在线播放 | 国产青青在线 | 久久久久亚洲精品男人的天堂 | 国产对白受不了了中文对白 | 另类一区二区 | 亚洲精品乱码久久久久久花季 | 强美女免费网站在线视频 | 国产又大又黑又粗免费视频 | 日出水了特别黄的视频 | 双腿张开被9个黑人调教影片 | www.av在线视频 | 81国产精品久久久久久久久久 | www.久久爱.com狼人 | 国产日韩欧美精品在线 | 嫩草视频网站 | 亚洲精品一区二区三区98年 | 乱码av午夜噜噜噜噜动漫 | 姑娘第5集高清在线观看 | 91精品国产91久久久久久久久 | 成人性生交大片免费8 | 亚洲日本中文字幕天天更新 | 国产精品国产亚洲精品看不卡15 | 四虎永久在线精品免费网站 | 特级做a爰片毛片免费看无码 | 国产一区二区视频播放 | 噼里啪啦在线看免费观看视频 | 香蕉视频在线播放 | 在线不卡日本v二区到六区 免费又黄又爽又猛的毛片 特级西西人体444www高清大胆 | 国产 精品 日韩 | 一区二区免费在线观看视频 | 国产精品一v二v在线观看 | 人妻少妇久久中文字幕一区二区 | 日韩污视频在线观看 | 极品白嫩丰满美女无套 | av毛片在线播放 | 国产伦理五月av一区二区 | 色妞导航 | 无码人妻啪啪一区二区 | 人人爽日日躁夜夜躁尤物 | 亚洲成av人片天堂网无码 | 久久激情五月丁香伊人 | 一区二区三区 欧美 | 好紧好湿好黄的视频 | 国产精品一区二区在线观看网站 | 日韩在线免费播放 | 男人的天堂视频在线观看 | 日韩在线你懂的 | 福利在线小视频 | 久久亚洲高清 | 欧美激情精品久久 | 亚a∨国av综av涩涩涩 | 午夜精品一区二区三区aa毛片 | 午夜黄色毛片 | 久久久久免费看黄a片app | 久久久久综合精品福利啪啪 | 亚洲国产一二 | 屁屁影院,国产第一页 | 少妇亲子伦av | 少妇一级淫片免费视频 | 少妇性做爰xxxⅹ性视频 | 在线观看99| 国产精品综合在线 | 欧洲精品一区二区 | 五码亚洲| 国产美女明星三级做爰 | 国产绿帽口舌视频vk | 男女爽爽无遮挡午夜视频 | 久久精品黄色 | 一区二区久久久久草草 | 欧美性猛交 xxxx | 精品无码人妻一区二区三区不卡 | 久久久久久综合网 | 91禁在线观看 | 国产精品国产精品国产专区不卡 | 国产成人综合欧美精品久久 | 日本一卡2卡3卡四卡精品网站 | 91视频免费网址 | 午夜天堂精品久久久久 | 美女流白浆视频 | 羞羞的视频网站 | 少妇交换做爰中文字幕 | 综合久久色 | 亚洲精品乱码久久久久久蜜桃图片 | 国产人妻精品久久久久野外 | 亚洲伦理视频 | 91色漫| 午夜免费福利在线观看 | av毛片久久久久午夜福利hd | 最新国产精品亚洲 | 亚洲国产成人精品无码区在线秒播 | 国产成人精品123区免费视频 | 姐姐的朋友2在线 | 国产精品久久久久高潮 | 萌白酱在线观看 | 少妇又紧又深又湿又爽视频 | 亚洲欧洲视频 | 手机在线免费av | 欧洲a级毛片 | 日本久久久久久科技有限公司 | 亚洲三级色 | 狠狠色丁香婷婷综合 | 色视频www在线播放国产人成 | 久久爰| 91丨九色丨高潮 | 欧美精品一区二区三区久久久 | 国产无套粉嫩白浆内谢 | 国产乱人乱精一区二视频国产精品 | 日韩va亚洲va欧美va久久 | 成人欧美一区二区三区的电影 | 4438x成人网最大色成网站 | 国产粉嫩高中好第一次不戴 | 亚洲国产精品一区二区美利坚 | 国产一区二区麻豆 | xxx18hd国语对白 | 五月婷婷在线观看视频 | 婷婷国产v亚洲v欧美久久 | 91九色精品女同系列 | 福利网站在线观看 | 精品一区二区三人妻视频 | 精品国产九九九 | 日本国产一区二区三区在线观看 | 天天摸天天看天天做天天爽 | 一本之道久久 | 中文字幕久热精品视频在线 | 大伊人网 | 国产女主播喷水视频在线观看 | 久久久久久www | 国内精品第一页 | 本色视频aaaaaa一级网站 | 成人一级生活片 | 纯爱无遮挡h肉动漫在线播放 | 日本久久精品视频 | xxxxx在线观看| 久久综合伊人77777麻豆 | 国产日韩中文字幕 | 成人午夜视频在线播放 | 精品福利视频一区二区 | 在线观看av不卡 | 国产精品videosex极品 | 男女爽爽| www超碰97| 国产免费女女脚奴视频网 | 成人午夜精品无码区久久 | 色婷婷综合久久久中文字幕 | 人人妻人人澡人人爽人人精品97 | 国产边打电话边做对白刺激 | 天天操操操| 最近日韩中文字幕 | 欧美激情性做爰免费视频 | 欧美爱爱网站 | 久久久久久久久久久久久大色天下 | 色又黄又爽18禁免费网站现观看 | 亚洲va韩国va欧美va精品 | 国产又大又粗又猛又爽的视频 | 国产第一亚洲 | 日日碰狠狠躁久久躁综合小说 | 人人做 | 国产一区二区 | 欧美偷拍综合 | 男女高h视频 | 亚洲丁香婷婷久久一区二区 | 夜先锋av资源网站 | 国产精品999 | 爆操少妇| 国产妇女馒头高清泬20p多 | 一本久道久久综合狠狠爱 | 香蕉国产片一级一级一级一级 | 国产精品入口麻豆九色 | 亚洲精品美女久久久 | 国产女女 | 澳门黄色网 | 综合人人 | 天天躁日日躁狠狠躁性色av王爷 | 超碰在线播放97 | 久久久精品999 | av合集| 国产69精品久久久久999天美 | 亚洲色图欧美在线 | 国产精品乱码 | 国产免费啪啪 | 中文无码精品a∨在线观看不卡 | 日本三级毛片 | 国产精品女主播一区二区三区 | 人人爽人人澡人人人妻 | 久久女同互慰一区二区三区 | 97久久天天综合色天天综合色hd | 成人片在线视频 | 啪网站| 强行从后面挺进人妻 | 国产精品久久久久乳精品爆 | 亚洲欧美综合精品久久成人 | 婷婷丁香色| 国产成人精品亚洲7777 | 日本精品视频免费 | 亚洲欧美成人一区 | 香蕉网久久 | 国产亚洲精品久久久久久 | 久久无码精品一区二区三区 | 亚洲 国产 韩国 欧美 在线 | 久久合合 | 在线手机av | av图片在线观看 | 蜜臀久久99精品久久久久野外 | 国产又黄又爽刺激片 | 亚洲v欧美v另类v综合v日韩v | 深夜免费在线视频 | 欧美性日韩 | 亚洲欧美国产高清va在线播放 | 亚洲蜜芽在线精品一区 | 在线观看免费观看av | 老熟妇仑乱一区二区视頻 | 青青草原综合久久大伊人精品 | 另类小说亚洲色图 | 九九热视频在线观看 | 在线精品视频一区二区三四 | 婷婷激情图片 | 久久伊人蜜桃av一区二区 | 污污视频网站在线免费观看 | 国产视频1区2区3区 国产视频69 | 亚洲欧美网站 | 成人av网站免费 | 麻豆国产露脸在线观看 | 亚洲天堂网一区二区 | 白洁乱淫76集 | 91麻豆精品国产91久久久更新时间 | 香港三日三级少妇三级99 | 精品极品三大极久久久久 | 欧美大成色www永久网站婷 | 91灌醉下药在线观看播放 | 中文字幕第12页 | 国产欧美精品日韩区二区麻豆天美 | 天堂资源地址在线 | 四虎免费影视 | 国产精品久久久久久一二三四五 | 最新精品国偷自产在线 | 超碰在线a | 狠狠色狠狠色很很综合很久久 | 亚洲免费观看高清完整 | 国产亚洲精品久久久91 | 久久精品麻豆日日躁夜夜躁 | 超薄丝袜足j好爽在线 | 少妇高潮九九九αv | 日韩欧美卡一卡二卡新区 | 午夜精品久久久久久久99 | 久久九九热re6这里有精品 | 欧美与动人物性生交 | 亚洲精品视频在线观看免费视频 | 久久久精品国产免大香伊 | 尤物永久网站 | 一区二区久久精品66国产精品 | 精品国产大片 | 国产免费黄色 | 国产精品一区久久久 | 99久久久国产精品免费蜜臀 | 一级特黄视频 | 波多野结衣欧美 | 精品亚洲一区二区三区四区五区 | 日本在线精品视频 | 一本久久a久久精品亚洲 | 在线观看中文字幕码 | 亚洲国产成人精品片在线观看 | 国产伦精品一区二区三区精品视频 | 男人午夜免费视频 | 欧美理论在线 | 日韩一级片免费 | 日本被黑人强伦姧人妻完整版 | 又色又爽又黄又免费的照片 | 伊人天堂在线 | 亚洲网址在线观看 | 97精品一区二区视频在线观看 | 一区视频在线免费观看 | 人人爽久久涩噜噜噜红粉 | 欧美一区二区三区黄色 | 美女裸体跪姿扒开屁股无内裤 | 精品无码无人网站免费视频 | 日本中文字幕乱码免费 | 夜福利视频 | 99夜夜 | 色婷婷精品视频 | 探花视频在线版播放免费观看 | 性色欲网站人妻丰满中文久久不卡 | 日韩在线视频看看 | 亚洲综合婷婷 | 火车卧铺高h肉辣文虐 | 不卡视频一区 | 一级黄网站 | 在线看h网站 | 国产成人精品牛牛影视 | 欧美第二区 | 91成人在线播放 | 国产又粗又猛又爽又黄的 | 亚洲美女偷拍 | 久久久久久久久久免费视频 | 亚洲色吧| 99在线播放视频 | 婷婷在线播放 | 成人免费精品视频 | 日韩 欧美 动漫 国产 制服 | 欧美日韩中文 | 女主和前任各种做高h | 久久精品国产亚洲a | 天堂无码人妻精品一区二区三区 | 韩国三级欧美三级国产三级 | 欧美性色网| 久久影视一区二区 | www.se天堂| 91丝袜在线观看 | 国产真实老熟女无套内射 | 99久久久久久久久 | 成人做爰www网站视频 | 久久久久久久久久久久91 | 色妞www精品视频 | 超碰人人99| 免费国产又色又爽又黄的网站 | www欧美日韩 | 做爰吃奶全过程免费的网站 | 免费人成无码大片在线观看 | 亚洲一区二区在线视频观看 | 女人黄色特级大片 | 国产成人精品一区二区仙踪林 | 五月天中文字幕 | 亚洲精品99久久久久久 | 三级网站免费播放 | 91小视频在线 | 国产精选在线 | 国产鲁鲁 | 黄色片视频免费观看 | 东方影院av久久久久久 | 九九热视频免费观看 | 青青草国产在线 | 精品香蕉99久久久久网站 | jlzzjizz在线播放观看 | 国产精品成人品 | 精品熟人一区二区三区四区 | 日本少妇色 | 亚洲久久视频 | 国产做爰全过程免费视频 | 18无码粉嫩小泬无套在线观看 | 女神思瑞女神久久一区二区 | 青青草自拍 | 国产农村乱对白刺激视频 | 中国美女乱淫免费看视频 | 中文字幕黄色片 | 中文字幕亚洲一区二区va在线 | 777一区二区 | 先锋资源在线视频 | 99国产精品自在自在久久 | 国产亚洲精品久久久久久久软件 | 激情爱爱网 | 国产精品奇米一区二区三区小说 | 欧美疯狂做受xxxxx高潮 | 欧美超逼视频 | 精品国自产在线观看 | 久久天天躁狠狠躁夜夜av不卡 | 中文字幕日韩精品无码内射 | 99精品国产丝袜在线拍国语 | 伊人久久大香线蕉综合四虎小说 | 午夜亚洲天堂 | 久久久av一区二区三区 | 永久免费的网站入口 | 日本又色又爽又黄又高潮 | 亚洲 日韩 激情 无码 中出 | 疯狂撞击丝袜人妻 | 成人片黄网站a毛片免费 | 色多多福利网站免费破解 | 99小视频| 日本美女动态图 | 97热视频 | 嫩草影院懂你的影院 | 国产一区二区三区视频在线 | 午夜不卡在线观看 | www.久久久久久久久久 | 日本美女影院 | 日韩精品免费一区二区夜夜嗨 | 成人77777| 9porny九色视频自拍 | 91黄色免费视频 | 日本理论中文字幕 | 午夜久久精品 | 性欢交69精品久久久 | 亚洲成人av | 粉嫩av久久一区二区三区小说 | 另类三区| 国产亚洲精久久久久久叶玉卿 | 亚洲玖玖爱 | 一区二区三区欧美精品 | 乱色精品无码一区二区国产盗 | 一本大道av日日躁夜夜躁 | 亚洲高潮| 日韩精品极品 | 欧美激情视频一区二区三区 | 国产人妻精品区一区二区三区 | 久久久久夜色精品国产老牛91 | 夜夜爽www| 5858s亚洲色大成网站www | 亚洲图片一区二区 | 米奇777超碰欧美日韩亚洲 | 男人的网址 | 凹凸精品熟女在线观看 | 蜜臀av午夜一区二区三区 | 爆乳2把你榨干哦ova在线观看 | 国产ts人妖一区二区 | 4438xx亚洲五月最大丁香 | 亚洲成人免费av | 天天av天天翘 | 欧美自拍亚洲综合丝袜 | 日韩中文字幕区一区有砖一区 | 亚洲永久无码7777kkk | 国产最爽的乱淫视频国语对白 | 免费视频网站在线观看入口 | 日韩欧美超碰 | 国产无套内射又大又猛又粗又爽 | 成人激烈床戏免费观看网站 | 日韩欧美国产成人 | 在线观看的黄色网址 | 国产性猛交xx乱老孕妇 | 91在线精品入口 | 午夜视频在线免费观看 | 美女网站污 | 开心久久婷婷综合中文字幕 | 深夜福利视频在线播放 | 中文字幕亚洲天堂 | 国产亚洲精品久久久久久无几年桃 | 免费观看日本污污ww网站 | 人妻无码一区二区不卡无码av | 东北老女人av | 欧美野外做受又粗又硬 | 国产小视频在线看 | 99久久久久久99国产精品免 | 第一次处破女hd精品出血 | 91免费 看片 | 欧美性猛交xxxx| 九九九热精品免费视频观看网站 | 国产女人水真多18毛片18精品 | 国产成人艳妇aa视频在线 | 懂色av蜜乳av一二三区 | 白白嫩嫩的美女无套内谢 | 91网站免费 | 日韩一级理论片 | 国产中年熟女高潮大集合 | 91亚洲精品久久久蜜桃网站 | 少妇高潮久久久久久一代女皇 | 日韩人妻不卡一区二区三区 | 国产精品福利在线 | 九色网站在线观看 | 色网在线免费观看 | 国产欧美日韩 | 婷婷丁香五月激情综合 | 亚洲女同疯狂舌吻唾液口水美女 | 欧美黑人又粗又大的性格特点 | 奇米影视第四色888 奇米影视久久 | 人妻饥渴偷公乱中文字幕 | 免费在线性爱视频 | 国内精品少妇在线播放98 | 国产精品7777cos | 黄色在线免费播放 | 国产精品欧美一区二区三区不卡 | 可以免费看av的网址 | 熟女人妻视频 | av日韩网址| 亚洲国产精久久久久久久 | 在线一级片 | 色综合网站 | 国产日韩欧美精品在线观看 | 黄页网站视频免费大全 |