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

透過FileProvider再看ContentProvider

移動開發 Android
大家應該都熟悉FileProvider吧,但是其誕生的原因,內部怎么實現的,又是怎么轉化為文件的,大家有了解多少呢?今天就通過它重新看看ContentProvider這個四大組件之一。

[[384130]]

前言

大家應該都熟悉FileProvider吧,但是其誕生的原因,內部怎么實現的,又是怎么轉化為文件的,大家有了解多少呢?今天就通過它重新看看ContentProvider這個四大組件之一。

在Android7.0,Android提高了應用的隱私權,限制了在應用間共享文件。如果需要在應用間共享,需要授予要訪問的URI臨時訪問權限。

以下是官方說明:

對于面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,并出現 FileUriExposedException 異常。要在應用間共享文件,您應發送一項 content:// URI,并授予 URI 臨時訪問權限。進行此授權的最簡單方式是使用 FileProvider 類。”

為什么限制在應用間共享文件

打個比方,應用A有一個文件,絕對路徑為file:///storage/emulated/0/Download/photo.jpg

現在應用A想通過其他應用來完成一些需求,比如拍照,就把他的這個文件路徑發給了照相應用B,然后應用B照完相就把照片存儲到了這個絕對路徑。

看起來似乎沒有什么問題,但是如果這個應用B是個“壞應用”呢?

  • 泄漏了文件路徑,也就是應用隱私。

如果這個應用A是“壞應用”呢?

  • 自己可以不用申請存儲權限,利用應用B就達到了存儲文件的這一危險權限。

可以看到,這個之前落伍的方案,從自身到對方,都是不太好的選擇。

所以Google就想了一個辦法,把對文件的訪問限制在應用內部。

  • 如果要分享文件路徑,不要分享file:// URI這種文件的絕對路徑,而是分享content:// URI,這種相對路徑,也就是這種格式:content://com.jimu.test.fileprovider/external/photo.jpg
  • 然后其他應用可以通過這個絕對路徑來向文件所屬應用 索要 文件數據,所以文件所屬的應用本身必須擁有文件的訪問權限。

也就是應用A分享相對路徑給應用B,應用B拿著這個相對路徑找到應用A,應用A讀取文件內容返給應用B。

配置FileProvider

搞清楚了要做什么事,接下來就是怎么做。

涉及到應用間通信的問題,還記得IPC的幾種方式嗎?

  • 文件
  • AIDL
  • ContentProvider
  • Socket
  • 等等。

從易用性,安全性,完整度等各個方面考慮,Google選擇了ContentProvider為這次限制應用分享文件的 解決方案。于是,FileProvider誕生了。

具體做法就是:

  1. <!-- 配置FileProvider--> 
  2.  
  3. <provider 
  4.     android:name="androidx.core.content.FileProvider" 
  5.     android:authorities="${applicationId}.provider" 
  6.     android:exported="false" 
  7.     android:grantUriPermissions="true"
  8.     <meta-data 
  9.         android:name="android.support.FILE_PROVIDER_PATHS" 
  10.         android:resource="@xml/provider_paths"/> 
  11. </provider> 
  12.  
  13.  
  14.  
  15. <?xml version="1.0" encoding="utf-8"?> 
  16. <paths xmlns:android="http://schemas.android.com/apk/res/android"
  17.     <external-path name="external" path="."/> 
  18. </paths> 
  1. //修改文件URL獲取方式 
  2.  
  3. Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile()); 

這樣配置之后,就能生成content:// URI,并且也能通過這個URI來傳輸文件內容給外部應用。

FileProvider這些配置屬性也就是ContentProvider的通用配置:

  • android:name,是ContentProvider的類路徑。
  • android:authorities,是唯一標示,一般為包名+.provider
  • android:exported,表示該組件是否能被其他應用使用。
  • android:grantUriPermissions,表示是否允許授權文件的臨時訪問權限。

其中要注意的是android:exported正常應該是true,因為要給外部應用使用。

但是FileProvider這里設置為false,并且必須為false。

這主要為了保護應用隱私,如果設置為true,那么任何一個應用都可以來訪問當前應用的FileProvider了,對于應用文件來說不是很可取,所以Android7.0以上會通過其他方式讓外部應用安全的訪問到這個文件,而不是普通的ContentProvider訪問方式,后面會說到。

也正是因為這個屬性為true,在Android7.0以下,Android默認是將它當成一個普通的ContentProvider,外部無法通過content:// URI來訪問文件。所以一般要判斷下系統版本再確定傳入的Uri到底是File格式還是content格式。

FileProvider源碼

接著看看FileProvider的主要源碼:

  1. public class FileProvider extends ContentProvider { 
  2.  
  3.     @Override 
  4.     public boolean onCreate() { 
  5.         return true
  6.     } 
  7.  
  8.     @Override 
  9.     public void attachInfo(@NonNull Context context, @NonNull ProviderInfo info) { 
  10.         super.attachInfo(context, info); 
  11.  
  12.         // Sanity check our security 
  13.         if (info.exported) { 
  14.             throw new SecurityException("Provider must not be exported"); 
  15.         } 
  16.         if (!info.grantUriPermissions) { 
  17.             throw new SecurityException("Provider must grant uri permissions"); 
  18.         } 
  19.  
  20.         mStrategy = getPathStrategy(context, info.authority); 
  21.     } 
  22.  
  23.  
  24.     public static Uri getUriForFile(@NonNull Context context, @NonNull String authority, 
  25.             @NonNull File file) { 
  26.         final PathStrategy strategy = getPathStrategy(context, authority); 
  27.         return strategy.getUriForFile(file); 
  28.     } 
  29.  
  30.  
  31.     @Override 
  32.     public Uri insert(@NonNull Uri uri, ContentValues values) { 
  33.         throw new UnsupportedOperationException("No external inserts"); 
  34.     } 
  35.  
  36.  
  37.     @Override 
  38.     public int update(@NonNull Uri uri, ContentValues values, @Nullable String selection, 
  39.             @Nullable String[] selectionArgs) { 
  40.         throw new UnsupportedOperationException("No external updates"); 
  41.     } 
  42.  
  43.  
  44.     @Override 
  45.     public int delete(@NonNull Uri uri, @Nullable String selection, 
  46.             @Nullable String[] selectionArgs) { 
  47.         // ContentProvider has already checked granted permissions 
  48.         final File file = mStrategy.getFileForUri(uri); 
  49.         return file.delete() ? 1 : 0; 
  50.     } 
  51.  
  52.     @Override 
  53.     public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, 
  54.             @Nullable String[] selectionArgs, 
  55.             @Nullable String sortOrder) { 
  56.         // ContentProvider has already checked granted permissions 
  57.         final File file = mStrategy.getFileForUri(uri); 
  58.  
  59.         if (projection == null) { 
  60.             projection = COLUMNS; 
  61.         } 
  62.  
  63.         String[] cols = new String[projection.length]; 
  64.         Object[] values = new Object[projection.length]; 
  65.         int i = 0; 
  66.         for (String col : projection) { 
  67.             if (OpenableColumns.DISPLAY_NAME.equals(col)) { 
  68.                 cols[i] = OpenableColumns.DISPLAY_NAME; 
  69.                 values[i++] = file.getName(); 
  70.             } else if (OpenableColumns.SIZE.equals(col)) { 
  71.                 cols[i] = OpenableColumns.SIZE
  72.                 values[i++] = file.length(); 
  73.             } 
  74.         } 
  75.  
  76.         cols = copyOf(cols, i); 
  77.         values = copyOf(values, i); 
  78.  
  79.         final MatrixCursor cursor = new MatrixCursor(cols, 1); 
  80.         cursor.addRow(values); 
  81.         return cursor
  82.     } 
  83.  
  84.     @Override 
  85.     public String getType(@NonNull Uri uri) { 
  86.   final File file = mStrategy.getFileForUri(uri); 
  87.  
  88.         final int lastDot = file.getName().lastIndexOf('.'); 
  89.         if (lastDot >= 0) { 
  90.             final String extension = file.getName().substring(lastDot + 1); 
  91.             final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
  92.             if (mime != null) { 
  93.                 return mime; 
  94.             } 
  95.         } 
  96.         return "application/octet-stream"
  97.     } 
  98.  
  99.  

任何一個ContentProvider都需要繼承ContentProvider類,然后實現這幾個抽象方法:

onCreate,getType,query,insert,delete,update。

(其中每個方法中的Uri參數,就是我們之前通過getUriForFile方法生成的content URI)

我們分三部分說說:

數據調用方面

其中,query,insert,delete,update四個方法就是數據的增刪查改,也就是進程間通信的相關方法。

其他應用可以通過ContentProvider來調用這幾個方法,來完成對本地應用數據的增刪查改,從而完成進程間通信的功能。

具體方法就是調用getContentResolver()的相關方法,例如:

  1. Cursor cursor = getContentResolver().query(uri, nullnullnull"userid");  

再回去看看FileProvider:

  • query,查詢方法。在該方法中,返回了File的name和length。
  • insert,插入方法。沒有做任何事。
  • delete,刪除方法。刪除Uri對應的File。
  • update,更新方法。沒有做任何事。

MIME類型

再看getType方法,這個方法主要是返回 Url所代表數據的MIME類型。

一般是使用默認格式:

  • 如果是單條記錄返回以vnd.android.cursor.item/ 為首的字符串
  • 如果是多條記錄返回vnd.android.cursor.dir/ 為首的字符串

具體怎么用呢?可以通過Content URI對應的ContentProvider配置的getType來匹配Activity。

有點拗口,比如Activity和ContentProvider這么配置的:

  1. <activity   
  2.     android:name=".SecondActivity">   
  3.     <intent-filter>   
  4.         <action android:name=""/>   
  5.         <category android:name=""/>   
  6.         <data android:mimeType="type_test"/>  
  7.     </intent-filter>   
  8. </activity>   
  1. @Override 
  2. public String getType(@NonNull Uri uri) { 
  3.     return "type_test"
  4.  
  5.  
  6. intent.setData(mContentRUI);   
  7. startActivity(intent) 

這樣配置之后,startActivity就會檢查Activity的mineType 和 Content URI 對應的ContentProvider的getType是否相同,相同情況下才能正常打開Activity。

初始化

最后再看看onCreate方法。

在APP啟動流程中,自動執行所有ContentProvider的attachInfo方法,并最后調用到onCreate方法。一般在這個方法中就做一些初始化工作,比如初始化ContentProvider所需要的數據庫。

而在FileProvider中,調用了attachInfo方法作為了一個初始化工作的入口,其實和onCreate方法的作用一樣,都是App啟動的時候會調用的方法。

在這個方法中,也是限制了exported屬性必須為false,grantUriPermissions屬性必須為true。

  1. if (info.exported) { 
  2.     throw new SecurityException("Provider must not be exported"); 
  3. if (!info.grantUriPermissions) { 
  4.     throw new SecurityException("Provider must grant uri permissions"); 

這個初始化方法和特性,也是被很多三方庫所利用,可以進行靜默無感知的初始化工作,而無需單獨調用三方庫初始化方法。比如Facebook SDK:

  1. <provider 
  2.     android:name="com.facebook.internal.FacebookInitProvider" 
  3.     android:authorities="${applicationId}.FacebookInitProvider" 
  4.     android:exported="false" /> 
  1. public final class FacebookInitProvider extends ContentProvider { 
  2.     private static final String TAG = FacebookInitProvider.class.getSimpleName(); 
  3.  
  4.     @Override 
  5.     @SuppressWarnings("deprecation"
  6.     public boolean onCreate() { 
  7.         try { 
  8.             FacebookSdk.sdkInitialize(getContext()); 
  9.         } catch (Exception ex) { 
  10.             Log.i(TAG, "Failed to auto initialize the Facebook SDK", ex); 
  11.         } 
  12.         return false
  13.     } 
  14.  
  15.     //... 

這樣一寫,就無需單獨集成FacebookSDK的初始化方法了,實現靜默初始化。

而Jetpack中的App Startup也是考慮到這些三方庫的需求,對三方庫的初始化進行了一個合并,從而優化了多次創建ContentProvider的耗時。

拿到Content URI 該怎么使用?

很多人都知道該怎么配置FileProvider讓別人(比如照相APP)來獲取我們的Content URI,但是你們知道別人拿到Content URI之后又是怎么獲取具體的File的呢?

其實仔細找找就能發現,在FileProvider.java中有注釋說明:

  1. The client app that receives the content URI can open the file and access its contents by calling 
  2.  {@link android.content.ContentResolver#openFileDescriptor(Uri, String) ContentResolver.openFileDescriptor}  
  3.  to get a {@link ParcelFileDescriptor} 

也就是openFileDescriptor方法,拿到ParcelFileDescriptor類型數據,其實就是一個文件描述符,然后就可以讀取文件流了。

  1. ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(intent.getData(), "r"); 
  2. FileReader reader = new FileReader(parcelFileDescriptor.getFileDescriptor()); 
  3. BufferedReader bufferedReader = new BufferedReader(reader); 

ContentProvider 實際應用

在平時的工作中,主要有以下以下幾種情況和ContentProvider打交道比較多:

  • 和系統的一些App通信,比如獲取通訊錄,調用拍照等。上述的FileProvider也是屬于這種情況。
  • 與自己的APP有一些交互。比如自家多應用之間,可以通過這個進行一些數據交互。
  • 三方庫的初始化工作。很多三方庫會利用ContentProvider自動初始化這一特性,進行一個靜默無感知的初始化工作。

總結

ContentProvider作為四大組件之一,似乎并沒有其他組件的存在感那么強。

但是他還是有自己的那一份職責,也就是在保證安全的情況下進行應用間通信,還可以擴展作為幫助初始化的組件。所以了解他,掌握它也是很重要的,沒準以后哪個時候你就需要他了。

不要忽視任何一個知識點。

參考

https://mp.weixin.qq.com/s/kQmH2GnwW8FK-yNmWcheTA 

https://segmentfault.com/a/1190000021357383

https://blog.csdn.net/lmj623565791/article/details/72859156

本文轉載自微信公眾號「碼上積木」,可以通過以下二維碼關注。轉載本文請聯系碼上積木公眾號。

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2014-07-29 15:57:01

ContentProv

2012-05-01 21:32:39

蘋果

2009-12-18 11:22:34

Ruby source

2009-07-16 08:50:53

微軟未來操作系統Windows 7

2013-11-13 10:33:10

KitKatAndroidChromeOS

2021-01-18 07:31:52

MySQL LeetCode查詢

2023-11-07 11:17:25

Android數據共享

2021-08-02 13:05:49

瀏覽器HTTP前端

2015-12-21 11:11:26

2015-03-26 18:52:38

2010-08-26 14:40:55

隱私保護

2023-02-17 18:32:42

JavaAIOIO

2013-09-25 09:26:03

平臺軟件企業虛擬化云網絡

2010-04-23 10:41:21

鏈路負載均衡

2012-07-31 11:06:48

WebGL

2016-03-18 13:02:19

2019-07-16 11:06:09

TCP四次揮手半關閉

2013-09-26 11:05:24

云計算虛擬化

2011-02-22 09:40:18

HashMap

2013-10-08 11:16:55

谷歌云計算
點贊
收藏

51CTO技術棧公眾號

精品国产乱码久久久久久影片| 国产精品女人毛片| 97在线观看免费高清| 91网站免费视频| av在线国产精品| 亚洲福利视频三区| 亚洲人成人77777线观看| 国产精品视频一区二区三区四| 亚洲一区二区蜜桃| 精精国产xxxx视频在线中文版 | 亚洲女人****多毛耸耸8| 高清国产在线一区| 亚洲天堂avav| 国产视频一区在线观看一区免费| 色婷婷综合久久久久中文字幕1| 久久久无码人妻精品无码| 国产v综合v| 亚洲高清免费观看| 中文字幕超清在线免费观看| 欧美日韩国产亚洲沙发| 国产成人一区在线| 成人激情电影一区二区| 4438国产精品一区二区| 在线视频观看日韩| 美日韩精品免费视频| 一区二区三区久久久久| 欧美激情网址| 精品对白一区国产伦| 亚洲美女性囗交| 大胆人体一区| 欧美日韩另类在线| 国产精品一色哟哟| www.在线视频| 中文字幕中文字幕一区| 日本一区二区三区视频在线播放| 嫩草影院一区二区| 懂色av一区二区夜夜嗨| 91夜夜未满十八勿入爽爽影院| 亚洲精品国产无码| 午夜亚洲伦理| 欧美有码在线观看| xxxx.国产| 一本久久综合| 欧美性受xxx| 国产污污视频在线观看| 欧美成人高清| 欧美日韩xxx| 超碰手机在线观看| 欧美国产先锋| 亚洲色图欧洲色图婷婷| 在线成人激情视频| 欧美性受xxxx黑人| 日韩欧美精品| 色噜噜狠狠狠综合曰曰曰88av| 亚洲欧洲久久久| 国内精品久久久久久久久电影网| 亚洲男人天堂2023| 欧美人妻一区二区三区| 日韩国产在线| 超薄丝袜一区二区| 久久国产在线观看| 亚洲国内精品| 日本精品久久久| 中文字幕手机在线视频| 免费观看30秒视频久久| 91精品在线国产| 亚洲毛片欧洲毛片国产一品色| 成人亚洲一区二区一| 好吊色欧美一区二区三区| 色视频免费在线观看| 国产午夜精品久久久久久久| 亚洲欧洲三级| 污污的网站在线免费观看| 亚洲国产欧美一区二区三区丁香婷| 欧美又粗又长又爽做受| 裤袜国产欧美精品一区| 欧美日韩视频一区二区| 国产成人精品综合久久久久99| 99精品国产一区二区三区2021 | 国产男女无遮挡猛进猛出| 视频在线亚洲| 亚洲精品一区二区三区不| 性欧美精品男男| 一区二区三区午夜探花| 97在线观看视频| 亚洲视频在线观看免费视频| 国产乱色国产精品免费视频| 国产在线欧美日韩| 91在线品视觉盛宴免费| 亚洲综合免费观看高清完整版 | 美女一区二区视频| 国产aⅴ精品一区二区三区黄| 人成在线免费视频| 亚洲欧美另类图片小说| 久久精品免费一区二区| 特级西西人体wwwww| **在线精品| 日韩限制级电影在线观看| 99久久国产精| 66视频精品| 日本不卡免费高清视频| 99久久精品国产色欲| 久久精品网站免费观看| 男人添女荫道口喷水视频| 国产精品伦一区二区| 亚洲电影免费观看高清完整版在线 | 国产精品88888| 欧美日本国产精品| 污污网站在线观看| 欧美人与z0zoxxxx视频| 亚洲黄色在线网站| 亚洲午夜久久久久久尤物| 国产精品视频资源| 深夜福利视频在线观看| 亚洲综合视频在线观看| www.成年人| 日本大胆欧美| 日产日韩在线亚洲欧美| 后进极品白嫩翘臀在线视频| 18成人在线观看| 国产精品一区二区羞羞答答| 日韩精选在线| 国内精品小视频| a天堂中文在线观看| 国产精品乱人伦中文| 国产一区亚洲二区三区| 欧美日韩破处| 久久久这里只有精品视频| av手机免费看| 亚洲丝袜自拍清纯另类| 一级做a免费视频| 精品99在线| 日韩av电影在线播放| 欧美偷拍视频| 日韩欧美成人网| 黄色国产在线观看| 亚洲女人av| 美女亚洲精品| 欧美成人资源| 亚洲欧美制服综合另类| 无码人妻黑人中文字幕| 久久亚洲精品小早川怜子| 日韩在线一级片| 三级黄色在线观看| 国产成人精品三级高清久久91| 久久全国免费视频| 视频污在线观看| 五月天一区二区| 亚洲色图14p| 国产美女诱惑一区二区| 九九九九九精品| 日韩精品美女| 亚洲色图综合网| 精品国产乱子伦| 中文字幕乱码一区二区免费| 天堂一区在线观看| 一区二区三区网站| 国产在线精品一区二区中文| 欧美久久天堂| 亚洲午夜精品久久久久久性色| 中文字幕 国产精品| 国产精品视频线看| 黄色a级三级三级三级| 欧美成人日本| 麻豆成人av| 韩国成人在线| 欧美wwwxxxx| 手机看片1024日韩| 在线亚洲+欧美+日本专区| 波多野结衣欲乱| 国产xxx精品视频大全| 欧美牲交a欧美牲交| 国产综合久久久| 亚洲最大的成人网| 51漫画成人app入口| 亚洲欧美一区二区三区久久| 亚洲一区二区影视| 亚洲一区免费视频| 偷拍夫妻性生活| 国产美女一区二区三区| 国产av麻豆mag剧集| 国产在视频线精品视频www666| 亚洲va久久久噜噜噜| 亚洲女同志freevdieo| 丝袜亚洲另类欧美重口| 隣の若妻さん波多野结衣| 91久久久免费一区二区| 2021亚洲天堂| 久久蜜桃香蕉精品一区二区三区| 九九热这里只有精品6| av成人免费网站| 国产99久久久国产精品| 日本xxxxxxx免费视频| 欧美影院一区| 日韩av一区二区三区美女毛片| 日本少妇精品亚洲第一区| 日本一区二区三区在线播放| 日韩电影免费观看| 中文在线不卡视频| 无码国产精品96久久久久| 欧美日韩精品一区二区在线播放| 欧美成人aaaaⅴ片在线看| 日本一区二区高清| 一本加勒比波多野结衣| 国产尤物一区二区在线| 精品少妇无遮挡毛片| 亚洲国产午夜| 樱空桃在线播放| 日本电影一区二区| 久久精品日产第一区二区三区精品版 | 外国成人激情视频| 欧美另类网站| 老汉色老汉首页av亚洲| 7777精品久久久大香线蕉小说| 欧美不卡高清一区二区三区| 97在线观看视频| 国产探花视频在线观看| 久久精品国产精品| 精品国产欧美日韩不卡在线观看| 久久免费资源| 97超视频免费观看| 国精产品一区一区三区mba下载| zzijzzij亚洲日本成熟少妇| 成年人视频在线免费观看| 国产丝袜一区视频在线观看| 蜜桃视频在线观看www| 欧美一级欧美一级在线播放| 国产又粗又猛又爽又黄91| 欧美在线观看一区| 狠狠狠狠狠狠狠| 一本大道久久a久久综合婷婷| 日韩 欧美 亚洲| 亚洲va韩国va欧美va精品 | 亚洲成人精品一区二区| 麻豆亚洲av成人无码久久精品| 亚洲欧洲日本在线| 久久久久人妻一区精品色| 国产精品理伦片| 中国1级黄色片| 国产精品视频免费| 九一在线免费观看| 国产精品久线观看视频| 香蕉成人在线视频| 国产精品进线69影院| www中文在线| 亚洲三级理论片| 国产一二三四区| 亚洲一级不卡视频| 激情综合网五月婷婷| 黄色一区二区在线| 五月天激情四射| 在线看日本不卡| 日产精品一线二线三线芒果| 经典三级一区二区| 国产精品视频久久| 亚洲成人1区| 波多野结衣精品久久| 99香蕉久久| 久久综合中文色婷婷| 精品国产一级毛片| 亚洲一区二区三区乱码| 亚洲国产一区二区三区在线播放| 毛片av在线播放| 一区二区三区四区五区在线| 国产精品亚洲a| 免费成人在线视频观看| 天堂网成人在线| 99久久精品情趣| 国产调教在线观看| 亚洲免费毛片网站| 精品少妇久久久| 在线免费观看成人短视频| 国产视频在线观看免费| 亚洲国产精品久久| jizz日韩| 久久久久久久一区二区三区| 成人日韩在线观看| 亚洲综合成人婷婷小说| 嫩草国产精品入口| 亚洲.欧美.日本.国产综合在线| 亚洲澳门在线| 男人亚洲天堂网| 国产真实乱子伦精品视频| xxxxxx黄色| 国产精品国产三级国产| av资源吧首页| 欧美日韩视频在线第一区| 亚洲精品一区二区三区四区| 国产午夜精品免费一区二区三区 | 久久69精品久久久久久久电影好 | 欧美精品三级日韩久久| 欧美性受xxxx狂喷水| 少妇久久久久久| 国产黄大片在线观看| 91在线高清免费观看| 欧美极品中文字幕| 在线观看17c| 免费在线观看不卡| 亚洲av成人无码一二三在线观看| 中文字幕精品在线不卡| 日韩精品国产一区二区| 91.成人天堂一区| 高清日韩av电影| 高清视频欧美一级| 天堂网www中文在线| 国产成人av电影在线| 亚洲av人人澡人人爽人人夜夜| 国产精品成人免费精品自在线观看| 日韩欧美不卡视频| 欧美一区二区在线播放| av在线首页| 青草青草久热精品视频在线网站| 999在线精品| 免费成人深夜夜行网站视频| 葵司免费一区二区三区四区五区| 少妇熟女视频一区二区三区| 亚洲视频在线观看三级| 亚洲永久精品一区| 日韩高清免费在线| 国产精品国精产品一二| 亚洲www视频| 91麻豆精品国产91久久久平台| 欧美牲交a欧美牲交aⅴ免费真 | 草莓视频一区| 天天做综合网| 男生操女生视频在线观看| 国产亚洲成av人在线观看导航 | 日韩制服丝袜av| 亚洲av无码国产精品久久| 亚洲国产一区二区在线播放| 一级特黄aaaaaa大片| 中文字幕一区电影| 韩国精品主播一区二区在线观看 | 91精品啪在线观看国产| 亚洲综合区在线| 精品欧美一区二区精品少妇| 美女性感视频久久久| 精品视频在线观看免费观看| 免费观看黄色的网站| 久久99国产精品成人| 欧美一区二区三区观看| 欧美日韩成人综合| 麻豆视频网站在线观看| 亚洲精品日产aⅴ| 欧美日韩一卡| www男人天堂| 偷窥国产亚洲免费视频| 青青草在线播放| 国产精品成人一区二区三区吃奶| 国产欧美日韩精品一区二区免费| 999精品网站| 国产精品美女久久久久久久网站| 在线观看xxxx| 久青草国产97香蕉在线视频| 一区二区视频| 老太脱裤让老头玩ⅹxxxx| 久久综合久久综合久久综合| 成年人晚上看的视频| 色妞欧美日韩在线| 一区二区三区视频免费视频观看网站 | 91香蕉电影院| 国产精品草草| 添女人荫蒂视频| 色妹子一区二区| 久cao在线| 国产综合动作在线观看| 久久亚洲国产精品一区二区| 国产一区二区三区视频播放| 欧美大片一区二区三区| 小视频免费在线观看| 日韩av中文在线| 黄色的视频在线免费观看| 国产精品亚洲片夜色在线| 欧美日韩一区二区国产| 中日韩精品一区二区三区 | 亚洲国产999| 欧美一区二粉嫩精品国产一线天| 成人免费a**址| 99国产精品免费视频| 欧美日韩亚洲精品内裤| 黄色在线播放网站| 国产在线资源一区| 精品一区二区三区免费| 日韩精品一区二区三| 日韩中文在线观看| 精品淫伦v久久水蜜桃| 天天干在线影院| 亚洲高清在线精品| 中文字幕在线视频区| 国产精品swag| 美女性感视频久久| 自拍偷拍欧美亚洲| 久久最新资源网| 国产剧情在线观看一区| 黄色av电影网站| 在线成人免费观看| 亚洲免费福利| 妞干网视频在线观看| 国产精品久线观看视频| 视频二区在线|