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

Android截屏與WebView長圖分享經驗總結

移動開發 Android
最近在做新業務需求的同時,我們在 Android 上遇到了一些之前沒有碰到過的問題,截屏分享、 WebView 生成長圖以及長圖在各個分享渠道分享時圖片模糊甚至分享失敗等問題,在這過程中踩了很多坑,到目前為止絕大部分的問題都還算是有了比較滿意的解決方案。以下就從三個方面來總結一下過程中遇到的挑戰和最后的解決方案。

[[192894]]

一、概述

最近在做新業務需求的同時,我們在 Android 上遇到了一些之前沒有碰到過的問題,截屏分享、 WebView 生成長圖以及長圖在各個分享渠道分享時圖片模糊甚至分享失敗等問題,在這過程中踩了很多坑,到目前為止絕大部分的問題都還算是有了比較滿意的解決方案。以下就從三個方面來總結一下過程中遇到的挑戰和***的解決方案。

二、截圖分享

在 Android 原生系統中是沒有提供截圖的廣播或者監聽事件的,也就是說代碼層面無法獲知用戶的截屏操作,這樣就無法滿足用戶截屏后跳出分享提示的需求。既然無法從根本上解決截屏監聽的問題,那么就要考慮通過其他方式間接實現,目前比較成熟穩定的方案是監聽系統媒體數據庫資源的變化,具體方案原理如下:

Android 系統有一個媒體數據庫,每拍一張照片,或使用系統截屏截取一張圖片,都會把這張圖片的詳細信息加入到這個媒體數據庫,并發出內容改變通知,我們可以利用內容觀察者(ContentObserver)監聽媒體數據庫的變化,當數據庫有變化時,獲取***插入的一條圖片數據,如果該圖片符合特定的規則,則認為被截屏了。

考慮到手機存儲包括內部存儲器和外部存儲器,為了增強兼容性,***同時監聽兩種儲存空間的變化,以下是需要 ContentObserver 監聽的資源 URI :

  1. MediaStore.Images.Media.INTERNAL_CONTENT_URI 
  2.  
  3. MediaStore.Images.Media.EXTERNAL_CONTENT_URI  

讀取外部存儲器資源,需要添加權限:

  1. android.permission.READ_EXTERNAL_STORAGE 

注:在 Android 6.0 及以上版本需要動態申請權限

1. 截屏判斷規則

當 ContentObserver 監聽到媒體數據庫的數據改變, 在有數據改變時獲取***插入數據庫的一條圖片數據, 如果符合以下規則, 則認為截屏了:

  • 時間判斷:通常截屏生成后會立馬存入系統多媒體數據庫,也就是說監聽到數據庫變化的時間與截圖生成的時間不會相差太多,這里推薦以10秒作為閾值,當然這個也是經驗值。
  • 尺寸判斷:截屏顧名思義取得是當前手機屏幕尺寸大小的圖片,所以圖片寬高大于屏幕寬高的肯定都不是截圖產生的。
  • 路徑判斷:由于各手機廠家存放截圖的文件路徑都不太一樣,國內情況可能會更嚴重,但是通常圖片保存路徑都會包含一些常見的關鍵詞,比如 “screenshot”、 “screencapture” 、 “screencap” 、 “截圖”、 “截屏”等,每次都檢查圖片路徑信息是否包含這些關鍵詞。

關于第3點需要補充說明一下,由于要判斷圖片文件路徑是否包含關鍵字,所以目前僅支持中英文環境,如果需要支持其他語言,需要手動添加一些該語言的關鍵詞,否則有可能獲取不到圖片。

以上3點基本上可以保證截圖的正常監聽,當然在實際測試過程中,還會發現有些機型存在多報的情況,所以還需要做一些去重等工作,關于去重下面還會再提及。

2. 關鍵代碼

原理都了解清楚了,那么接下來就是如何實現的問題了。這里最關鍵是媒體內容觀察者的設置,從數據庫中取出***條數據并解析圖片信息,然后再檢驗圖片信息是否符合以上3條規則。

為了說清楚如何監聽媒體數據庫改變,先要稍微講一下 ContentObserver 的原理。 ContentObserver ——內容觀察者,目的是觀察(捕捉)特定 Uri 引起的數據庫的變化,繼而做一些相應的處理,它類似于數據庫技術中的觸發器(Trigger),當 ContentObserver 所觀察的 Uri 發生變化時,便會觸發它。當然想要觀察就必須先要注冊, Android 系統提供了 ContentResolver#registerContentObserver 方法用來注冊觀察器。此部分不熟悉的同學可以溫習一下 Android 的 ContentProvider 相關知識。

接下來直接用代碼說明整個注冊和觸發流程,代碼如下: 

  1. private void initMediaContentObserver() {    // 運行在 UI 線程的 Handler, 用于運行監聽器回調  
  2.     private final Handler mUiHandler = new Handler(Looper.getMainLooper());    // 創建內容觀察者,包括內部存儲和外部存儲 
  3.     mInternalObserver = new MediaContentObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI, mUiHandler); 
  4.     mExternalObserver = new MediaContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mUiHandler);    // 注冊內容觀察者 
  5.     mContext.getContentResolver().registerContentObserver( 
  6.             MediaStore.Images.Media.INTERNAL_CONTENT_URI, false, mInternalObserver); 
  7.     mContext.getContentResolver().registerContentObserver( 
  8.             MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, mExternalObserver); 
  9. }/** 
  10.  * 自定義媒體內容觀察者類(觀察媒體數據庫的改變) 
  11.  */private class MediaContentObserver extends ContentObserver {    private Uri mediaContentUri;       // 需要觀察的Uri 
  12.     public MediaContentObserver(Uri contentUri, Handler handler) {        super(handler); 
  13.         mediaContentUri = contentUri; 
  14.     }    @Override 
  15.     public void onChange(boolean selfChange) {        super.onChange(selfChange);        // 處理媒體數據庫反饋的數據變化 
  16.         handleMediaContentChange(mediaContentUri); 
  17.     } 
  18.  

有注冊就需要在 Activity 銷毀時取消注冊,所以還需要封裝一個解除注冊的方法供外部調用, Android 系統提供 ContentResolver#unregisterContentObserver 方法來取消注冊,代碼比較簡單,這里就不再展示了。

監聽器設置和注冊完成后,一旦用戶操作了截屏動作,系統就會執行 ContentObserver#onChange 回調方法,在這個方法中我們可以根據 Uri 獲取并解析數據。這里展示一下具體的數據解析過程,上述提到的規則判斷比較簡單,就不再展示了。

  1. private void handleMediaContentChange(Uri contentUri) { 
  2.     Cursor cursor = null;        try {            // 數據改變時查詢數據庫中***加入的一條數據 
  3.             cursor = mContext.getContentResolver().query(contentUri, 
  4.                     Build.VERSION.SDK_INT < 16 ? MEDIA_PROJECTIONS : MEDIA_PROJECTIONS_API_16,                    nullnull, MediaStore.Images.ImageColumns.DATE_ADDED + " desc limit 1");            if (cursor == null)  return;            if (!cursor.moveToFirst()) return;        
  5.  
  6.             // cursor.getColumnIndex獲取數據庫列索引 
  7.             int dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
  8.             String data = cursor.getString(dataIndex);        // 圖片存儲地址 
  9.  
  10.             int dateTakenIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN);            long dateTaken = cursor.getLong(dateTakenIndex);  // 圖片生成時間 
  11.  
  12.             int width = 0;            int height = 0;            if (Build.VERSION.SDK_INT >= 16) {                int widthIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.WIDTH);                int heightIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.HEIGHT); 
  13.                 width = cursor.getInt(widthIndex);    // 獲取圖片高度 
  14.                 height = cursor.getInt(heightIndex);  // 獲取圖片寬度 
  15.             } else { 
  16.                 Point size = getImageSize(data);     // 根據路徑獲取圖片寬和高 
  17.                 width = size.x; 
  18.                 height = size.y; 
  19.             }            // 處理獲取到的***行數據,分別判斷路徑是否包含關鍵詞、時間差以及圖片寬高和屏幕寬高的大小關系 
  20.             handleMediaRowData(data, dateTaken, width, height); 
  21.  
  22.         } catch (Exception e) { 
  23.             e.printStackTrace(); 
  24.         } finally {            if (cursor != null && !cursor.isClosed()) { 
  25.                 cursor.close(); 
  26.             } 
  27.         } 

 有些手機 ROM 截屏一次會發出多次內容改變的通知,因此需要做去重操作,去重也不復雜,可以用列表緩存最近十幾條圖片地址數據,每次獲取到新的圖片地址,都會先判斷緩存中是否存在相同的圖片地址,如果當前的圖片地址已經存在列表中,則直接過濾掉即可,否則添加到緩存中。如此就可以保證截屏監聽事件既不遺漏也不重復。

以上就是手機截屏的核心原理和關鍵代碼,如果需要分享截屏圖片也很簡單, data 即為圖片的存儲地址,轉換成 Bitmap 即可完成分享。

二、WebView 生成長圖

介紹 web 長圖之前,先來說一下單屏圖片的生成方案,和手機截圖不同的是生成的圖片不會顯示頂部的狀態欄、標題欄以及底部的菜單欄,可以滿足不同的業務需求。

  1. // WebView 生成當前屏幕大小的圖片,shortImage 就是最終生成的圖片Bitmap shortImage = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.RGB_565); 
  2. Canvas canvas = new Canvas(shortImage);   // 畫布的寬高和屏幕的寬高保持一致Paint paint = new Paint(); 
  3. canvas.drawBitmap(shortImage, screenWidth, screenHeight, paint); 
  4. mWebView.draw(canvas);  

有的時候我們需要將一個長 Web 網頁生成圖片分享出去,相似的例子就是手機端的各種便簽應用,當便簽內容超出一屏時,就需要將所有的內容生成一張長圖對外分享出去。

WebView 和其他 View 一樣,系統都提供了 draw 方法,可以直接將 View 的內容渲染到畫布上,有了畫布我們就可以在上面繪制其他各種各種的內容,比如底部添加 Logo 圖片,畫紅線框等等。關于 WebView 生成長圖網上已經有很多現成的方案和代碼,以下代碼是經測試過的穩定版本,供參考。

  1. // WebView 生成長圖,也就是超過一屏的圖片,代碼中的 longImage 就是***生成的長圖mWebView.measure(MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), 
  2.                  MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
  3. mWebView.layout(0, 0, mWebView.getMeasuredWidth(), mWebView.getMeasuredHeight()); 
  4. mWebView.setDrawingCacheEnabled(true); 
  5. mWebView.buildDrawingCache(); 
  6. Bitmap longImage = Bitmap.createBitmap(mWebView.getMeasuredWidth(), 
  7.         mWebView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
  8.  
  9. Canvas canvas = new Canvas(longImage);    // 畫布的寬高和 WebView 的網頁保持一致Paint paint = new Paint(); 
  10. canvas.drawBitmap(longImage, 0, mWebView.getMeasuredHeight(), paint); 
  11. mWebView.draw(canvas);  

Android 為了提高滾動等各方面的繪制速度,可以為每一個 View 建立一個緩存,使用 View#buildDrawingCache 為自己的 View 建立相應的緩存, 這個 cache 就是一個 bitmap 對象。利用這個功能可以對整個屏幕視圖進行截屏并生成 Bitmap ,也可以獲得指定的 View 的 Bitmap 對象。這里由于還要在原有的圖片上繪制 Logo ,所以直接使用了 WebView 的 draw 方法了。

由于我們的 H5 頁面大部分都是運行在微信的 X5 瀏覽器中,所以為了減少前端的適配工作,我們將騰訊的 X5 瀏覽器內核引入了 Android 工程中,代替系統原生的 WebView 內核,關于 X5 內核的引入后續還會有專門的文章介紹,敬請期待。

這里需要說明一下如何在 X5 內核下生成 Web 長圖,上面代碼展示的系統原生 WebView 生成圖片的方案,但是在 X5 環境下上述代碼就失效了,經過踩坑以及查看 X5 內核源代碼,最終我們找到了解決該問題的方法,下面用關鍵代碼來說明一下具體的實現方式。

  1. // 這里的 mWebView 就是 X5 內核的 WebView ,代碼中的 longImage 就是***生成的長圖mWebView.measure(MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), 
  2.                  MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
  3. mWebView.layout(0, 0, mWebView.getMeasuredWidth(), mWebView.getMeasuredHeight()); 
  4. mWebView.setDrawingCacheEnabled(true); 
  5. mWebView.buildDrawingCache(); 
  6. Bitmap longImage = Bitmap.createBitmap(mWebView.getMeasuredWidth(), 
  7.         mWebView.getMeasuredHeight() + endHeight, Bitmap.Config.ARGB_8888); 
  8. Canvas canvas = new Canvas(longImage);    // 畫布的寬高和 WebView 的網頁保持一致Paint paint = new Paint(); 
  9. canvas.drawBitmap(longImage, 0, mWebView.getMeasuredHeight(), paint);float scale = getResources().getDisplayMetrics().density; 
  10. x5Bitmap = Bitmap.createBitmap(mWebView.getWidth(), mWebView.getHeight(), Bitmap.Config.ARGB_8888); 
  11. Canvas x5Canvas = new Canvas(x5Bitmap); 
  12. x5Canvas.drawColor(ContextCompat.getColor(this, R.color.fragment_default_background)); 
  13. mWebView.getX5WebViewExtension().snapshotWholePage(x5Canvas, falsefalse);  // 少了這行代碼就無法正常生成長圖Matrix matrix = new Matrix(); 
  14. matrix.setScale(scale, scale); 
  15. longCanvas.drawBitmap(x5Bitmap, matrix, paint);  

注:X5 內核生成的長圖清晰度比原生 WebView 要差一些,目前還沒有太好的解決方案。

三、長圖分享

一般我們向各個社交平臺上發送的圖片都比較小,***也就是手機屏幕大小的圖片,再大的就不多見了。但是也有例外,比如微博的長圖、錘子便簽的長圖等等,如果直接將這些圖片通過微信分享 SDK 或者微博分享 SDK 分享出去,就會發現圖片基本上都是模糊的,但是將圖片發送給 iPhone 手機就可以正常查看,我們只能哀嘆 Android 版微信不給力。

微信 SDK 不給力,但是產品體驗還是不能丟,怎么辦呢?辦法還是有的,我們都知道除了各個社交平臺自己的分享 SDK ,系統提供了原生分享方案,本質上就是社交平臺把目標 Activity 對外暴露了出來,然后第三方 App 就可以根據事先定義好的 Intent 跳轉規則喚起社交平臺,同時完成數據傳輸和展示。

好像問題可以***解決了,但是還是有坑需要接著踩。在 Android 7.0 及以上的版本系統限制了 Intent 傳輸 file:// 開頭的數據,這也就限制了系統原生分享單圖,怎么辦呢?兩種方案,一種是在 7.0 及以上版本上使用微信等分享 SDK ,接受分享圖片模糊的現狀,另一種是通過反射跳過系統對以 file:// 開頭文件在 Intent 中傳輸的限制,但是這種方式會有風險,畢竟我們不知道未來 Android 會做出什么調整。以下是跳過系統限制的代碼片段,供參考。

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {    try { 
  2.         Method ddfu = StrictMode.class.getDeclaredMethod("disableDeathOnFileUriExposure"); 
  3.         ddfu.invoke(null); 
  4.     } catch (Exception e) { 
  5.  
  6.     } 
  7.  

至此基本上可以滿足任意圖片大小的分享了。此外經過驗證還發現微信分享 Android 版 SDK 對縮略圖和分享圖的大小都有限制,官方給的指導意見是縮略圖小于 32K ,分享圖片小于 10M 即可正常分享,但是試驗下來這兩個值都是理論上限,不要太接近這個上限,如果圖片太大,縮略圖和分享圖都會出現模糊的情況,甚至無法正常分享,當然對于通過系統分享的話就不存在這個限制,圖片也比較清晰。

除了圖片大小有限制,縮略圖的尺寸也是有限制的,這一點官方文檔并沒有給出,試驗結果顯示圖片尺寸小于等于120x120是比較安全的范圍,分享都沒有問題。

四、小結

截屏監聽、 WebView 生成長圖以及長圖分享都是我們團隊之前未曾遇到過的業務需求,在滿足產品業務需求的同時,也踩了很多坑,積累了一些經驗,特此總結。

責任編輯:龐桂玉 來源: TalkWithMobile
相關推薦

2017-05-26 12:19:28

android代碼WebView

2011-07-08 13:15:52

JSP

2010-01-27 18:12:14

Android dia

2010-01-26 13:28:11

Android開發要點

2009-10-15 09:27:00

2009-09-29 16:32:11

OJB Hiberna

2009-08-19 09:24:43

AJAX引擎經驗總結

2009-09-16 17:13:54

學習Linq

2010-01-25 14:25:33

Android Int

2010-01-25 13:37:07

Android傳感器

2010-05-19 16:57:49

SVN與CVS的區別

2009-09-25 17:26:55

使用Hibernate

2009-09-27 14:53:38

Hibernate S

2013-12-18 15:54:21

2009-08-13 18:13:27

C#學習經驗

2010-07-16 09:14:49

Perl模式

2009-12-24 16:46:03

WPF性能優化

2010-03-08 15:12:27

Python語言

2010-06-13 13:44:07

UML學習筆記

2011-07-21 13:40:17

java
點贊
收藏

51CTO技術棧公眾號

欧美日韩午夜剧场| 成人黄色777网| 久久精品小视频| 亚洲丝袜在线观看| 男人av在线播放| 亚洲国产精华液网站w| 91欧美激情另类亚洲| 99久久精品国产亚洲| 日韩免费视频| 亚洲国产精品va在线| 视色视频在线观看| 鲁鲁在线中文| 亚洲日本乱码在线观看| 麻豆成人av| 国产ts人妖调教重口男| 日韩不卡一区二区三区| 久久久久久成人精品| 阿v天堂2014| 欧美成人午夜77777| 欧美人伦禁忌dvd放荡欲情| 性一交一乱一伧国产女士spa| 好男人免费精品视频| 国产成人免费av在线| 国产精品亚洲美女av网站| 日本一区二区三区免费视频| 国产精品99视频| 亚洲欧美综合v| 国产一卡二卡三卡四卡| 粉嫩一区二区三区在线观看 | 中文字幕av久久爽av| 竹菊久久久久久久| 欧美精品一区二区三区在线播放| 成人日韩在线视频| 蜜桃成人精品| 欧美性猛交xxxx免费看久久久| 国产在线观看欧美| 久久综合网导航| 中文字幕在线播放不卡一区| 欧美大香线蕉线伊人久久国产精品| 亚洲国产精品suv| 国产毛片精品国产一区二区三区| 国产精品日韩欧美| 中文字幕精品无| 亚洲一区二区动漫| 97香蕉久久夜色精品国产| 九九久久免费视频| 欧美一区高清| 欧美国产乱视频| 成年人av电影| 欧美日韩综合| 欧美激情亚洲另类| 国产无遮挡裸体免费视频| 欧美激情1区| 欧美高清自拍一区| 免费中文字幕视频| 激情成人亚洲| 久久青草福利网站| 国产黄色片免费看| 久久av最新网址| 欧美在线精品免播放器视频| 色屁屁影院www国产高清麻豆| 国产精品毛片在线| 日韩免费av片在线观看| 麻豆精品久久久久久久99蜜桃| 国产农村妇女毛片精品久久莱园子| 欧美亚洲国产视频| 日本天堂网在线| 午夜在线视频观看日韩17c| 日本a级片电影一区二区| 波多野结衣绝顶大高潮| 美女网站在线免费欧美精品| 91日本在线视频| 亚洲国产成人精品一区二区三区| av激情综合网| 日韩国产精品一区二区三区| 日本在线观看www| 亚洲欧美福利一区二区| 拔插拔插海外华人免费| 超级碰碰久久| 欧美精品成人一区二区三区四区| 波多野结衣三级视频| 日韩在线麻豆| 日韩小视频网址| 久热精品在线观看| 丝袜国产日韩另类美女| 成人高清视频观看www| 性做久久久久久久久久| 91偷拍与自偷拍精品| 一级日韩一区在线观看| 国内在线免费视频| 在线精品视频免费播放| 成年人网站av| 色橹橹欧美在线观看视频高清| 亚洲色图五月天| 永久免费看黄网站| 欧美一级一区| 亚洲xxxxx性| 欧美91精品久久久久国产性生爱| 国产精品每日更新在线播放网址| 欧美亚洲黄色片| 精品免费av一区二区三区 | 色婷婷激情五月| 国产欧美在线观看一区| 日韩一区二区高清视频| 日韩在线观看不卡| 精品国产乱码久久久久久浪潮| 欧美精品日韩在线| 亚洲黄页一区| 成人春色激情网| 韩国精品视频| 亚洲午夜精品17c| 日本黄色的视频| 免费看成人吃奶视频在线| 成人97在线观看视频| 怡红院av久久久久久久| 丁香天五香天堂综合| 一区二区三区观看| 国产不卡网站| 亚洲国内精品视频| 劲爆欧美第一页| 精一区二区三区| 色狠狠久久av五月综合| 涩涩网在线视频| 日韩精品一区二区三区在线播放 | 亚洲不卡在线观看| 超碰在线资源站| 三上亚洲一区二区| 国产精品高潮呻吟久久av黑人| 开心激情综合网| 一区二区三区四区在线播放| www.超碰97.com| 欧美日韩中文一区二区| 欧美在线激情网| 日韩欧美在线观看一区二区| 亚洲国产日韩一级| 少妇搡bbbb搡bbb搡打电话| 亚洲xxx拳头交| 国产免费成人av| 午夜在线观看视频| 精品婷婷伊人一区三区三| 国产美女永久免费无遮挡| 国产精品亚洲综合久久| 好吊色欧美一区二区三区四区| 亚洲图区一区| 精品免费视频.| 国产一级久久久| 成人免费视频一区| 蜜臀av色欲a片无码精品一区| 在线视频亚洲欧美中文| 九九热r在线视频精品| 国产免费黄色录像| 亚洲精品国产第一综合99久久| 国内av一区二区| 亚洲色图88| 99国产在线观看| caoporn视频在线| 日韩成人免费视频| 中文字幕日韩免费| 国产日产亚洲精品系列| 中文字幕天天干| 久久精品青草| 99久久久精品免费观看国产 | 国产z一区二区三区| 国产福利在线观看| 欧美日韩免费在线视频| 999精品视频在线观看播放| 国产精品一区二区视频| 成人黄色大片网站| 国产videos久久| 成人av电影天堂| 好看的中文字幕在线播放| 日韩高清a**址| 波多野结衣日韩| 成人欧美一区二区三区在线播放| 久久无码人妻一区二区三区| 极品日韩av| 茄子视频成人在线观看 | 黄色在线看片| 亚洲精品影视在线观看| 最近日韩免费视频| 一区二区三区高清| 扒开jk护士狂揉免费| 久久99久久精品| 久久精品国产sm调教网站演员| 美女毛片一区二区三区四区| 国产欧美一区二区白浆黑人| 国产91足控脚交在线观看| 亚洲欧美日韩国产中文| 国产精品欧美综合亚洲| 天天av天天翘天天综合网色鬼国产 | 大美女一区二区三区| 国模吧无码一区二区三区| 久久亚洲影视| 久草一区二区| 精品久久久久久久久久岛国gif| 97人人做人人爱| 欧美成人三区| 日韩精品视频在线播放| 国产精品热久久| 在线一区二区三区四区五区| 久草成人在线视频| 国产精品天干天干在观线| 香港三日本8a三级少妇三级99| 美国欧美日韩国产在线播放| 无码专区aaaaaa免费视频| 日韩精品一区二区三区免费观影 | 欧美日韩免费| 亚洲女人毛片| 亚洲8888| 国产精品污www一区二区三区| 岛国一区二区| 欧美亚洲第一页| 超碰在线最新| 亚洲欧美国产精品久久久久久久| 精品人妻午夜一区二区三区四区| 欧美午夜在线一二页| 九九免费精品视频| 国产三级一区二区| 国产xxxx视频| 高清久久久久久| 久久精品一卡二卡| 理论片日本一区| 精品久久久久久中文字幕2017| 亚洲每日更新| 六月婷婷激情综合| 欧美不卡高清| 成年人黄色在线观看| 日本不卡电影| 日韩资源av在线| 欧美男男gaytwinkfreevideos| 精品蜜桃一区二区三区| youjizzjizz亚洲| 99超碰麻豆| 日韩精品一区二区三区中文在线| 国产日韩欧美另类| 成人在线中文| 国产精品爽爽ⅴa在线观看| 日韩不卡免费高清视频| 日韩av免费看| 欧美最新精品| 国产精品高清免费在线观看| 欧美成人黑人| 国产成人av网址| 欧美日韩视频免费观看| 国产黑人绿帽在线第一区| 欧美成人h版| 国产欧美精品xxxx另类| 欧美爱爱视频| 成人免费xxxxx在线观看| 99久久久成人国产精品| 成人伊人精品色xxxx视频| 老司机亚洲精品一区二区| 444亚洲人体| 91成人短视频| 精品一区二区三区日本| 希岛爱理av免费一区二区| 免费日韩电影在线观看| 国产成人三级| 亚洲一区精彩视频| 亚洲人metart人体| 男人插女人视频在线观看| av成人毛片| av无码精品一区二区三区| 人人爽香蕉精品| 亚洲一区二区偷拍| 白白色亚洲国产精品| 国产精品毛片一区二区| 国产精品乱人伦| 免费毛片在线播放免费| 婷婷久久综合九色综合绿巨人| 91在线视频在线观看| 欧美视频在线观看一区| 国产aⅴ一区二区三区| 亚洲激情免费观看| 1024国产在线| 久久99精品久久久久久噜噜| 国产美女高潮在线| 国产精品尤物福利片在线观看| 精品视频成人| 久久精品人人做人人爽电影| 欧美一站二站| 国产精品久久久久9999爆乳| 日韩国产欧美在线播放| 国产黄色一区二区三区 | 欧美亚洲精品日韩| 99久久99久久精品国产片果冰| 欧美性潮喷xxxxx免费视频看| 香蕉亚洲视频| 亚洲精品无码久久久久久久| 26uuu精品一区二区| 国产三级aaa| 午夜精品久久久久久久久| 中文字幕乱码人妻二区三区| 精品国产91久久久久久久妲己| 国产福利小视频在线观看| 欧美黄色三级网站| 国语自产精品视频在线看抢先版结局| 不卡一区二区三区视频| 欧美日韩国产在线观看网站 | 水野朝阳av一区二区三区| 国产欧美精品一二三| 久久久久久久精| 久久精品99久久久久久| 欧美中文字幕一区二区三区| 亚洲精品一区二区三区蜜桃| 中文字幕av一区二区| 色综合亚洲图丝熟| 99在线首页视频| 欧美wwwww| 国内自拍在线观看| 丁香啪啪综合成人亚洲小说| 337人体粉嫩噜噜噜| 午夜精品免费在线| www.av导航| 色777狠狠综合秋免鲁丝| 一区二区三区电影大全| 春色成人在线视频| 香蕉久久网站| 亚洲综合色在线观看| 久久精品在线观看| 激情五月色婷婷| 欧美大肚乱孕交hd孕妇| 二区在线播放| 成人av.网址在线网站| 欧美三级三级| 人人爽人人av| 久久久五月婷婷| 成人午夜视频精品一区| 精品国产a毛片| 免费在线中文字幕| 春色成人在线视频| 欧美区国产区| 污污视频在线免费| 亚洲欧美一区二区久久| 国产精品欧美激情在线| 日韩在线视频网站| 久久免费资源| 一区二区不卡视频| 老司机精品视频在线| 欧美性生交大片| 欧美肥胖老妇做爰| 国产在线69| 亚洲一区二区久久久久久| 午夜精品一区二区三区国产 | 久久久国产精品一区| 在线欧美激情| 日韩欧美一级在线| 高清不卡在线观看| 国产第一页在线播放| 亚洲黄色有码视频| 在线手机中文字幕| 欧美综合77777色婷婷| 老牛国产精品一区的观看方式| 亚洲一区二区三区蜜桃| 欧美色欧美亚洲另类二区| 日本三级视频在线观看| 亚洲tv在线观看| 国产精品大片| 黄色性生活一级片| 色噜噜久久综合| 亚洲搞黄视频| 99久久免费国| 久久动漫亚洲| av片在线免费看| 欧美一区二区精品在线| 成人影音在线| 欧洲一区二区在线| 国产在线精品一区在线观看麻豆| 少妇人妻丰满做爰xxx| 亚洲福利影片在线| 日韩精品专区| 伊人网在线免费| 99精品国产视频| 亚洲国产无线乱码在线观看 | 中文字幕乱码在线播放| 亚洲免费在线精品一区| 国产成人免费在线观看| 男人天堂2024| 欧美成人sm免费视频| 日韩精品免费一区二区夜夜嗨 | 自拍偷自拍亚洲精品被多人伦好爽| 亚洲国产欧洲综合997久久| 国产精品 日产精品 欧美精品| 国产一级片免费| 中文字幕亚洲自拍| 成功精品影院| 99视频在线视频| 亚洲午夜在线电影| 成年人视频在线观看免费| 3d动漫精品啪啪一区二区三区免费| 国产一区二区三区久久| 天堂av免费在线| 亚洲精品久久久久| 95精品视频| 激情综合网婷婷| 亚洲午夜久久久久| 日本在线免费看| 欧美婷婷久久| 成人av资源网站| 国产视频在线观看免费|