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

截屏實現方式和監聽截屏詳解

移動開發 Android
今天我們來介紹下Android里截屏方面的知識點介紹;通過獲取DecorView的方式來實現截屏(前提是當前Activity已經加載完成),DecorView為整個Window界面的最頂層View,因此截屏不包含狀態欄(SystemUI)部分.

[[433218]]

前言

今天我們來介紹下Android里截屏方面的知識點介紹;

一、Android截屏的方式

1、獲取DecorView截屏

通過獲取DecorView的方式來實現截屏(前提是當前Activity已經加載完成),DecorView為整個Window界面的最頂層View,因此截屏不包含狀態欄(SystemUI)部分.

方式一

  1. View view = getWindow().getDecorView();     // 獲取DecorView 
  2.    view.setDrawingCacheEnabled(true); 
  3.    view.buildDrawingCache(); 
  4.    Bitmap bitmap1 = view.getDrawingCache();    

方式二

  1. Bitmap bitmap2 = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); 
  2.    Canvas canvas = new Canvas(); 
  3.    canvas.setBitmap(bitmap2); 
  4.    view.draw(canvas); 

保存 bitmap1 或 bitmap2 均可保存截屏圖片

2、調用系統源碼截屏

由于是hide api,通過反射調用如下:

  1. public Bitmap takeScreenShot() { 
  2.         Bitmap bmp = null
  3.         mDisplay.getMetrics(mDisplayMetrics); 
  4.         float[] dims = {(float) mDisplayMetrics.widthPixels, (float) heightPixels}; 
  5.         float degrees = getDegreesForRotation(mDisplay.getRotation()); 
  6.         boolean requiresRotation = degrees > 0; 
  7.         if (requiresRotation) { 
  8.             mDisplayMatrix.reset(); 
  9.             mDisplayMatrix.preRotate(-degrees); 
  10.             mDisplayMatrix.mapPoints(dims); 
  11.             dims[0] = Math.abs(dims[0]); 
  12.             dims[1] = Math.abs(dims[1]); 
  13.         } 
  14.         try { 
  15.             Class<?> demo = Class.forName("android.view.SurfaceControl"); 
  16.             Method method = demo.getMethod("screenshot", new Class[]{Integer.TYPE, Integer.TYPE}); 
  17.             bmp = (Bitmap) method.invoke(demo, new Object[]{Integer.valueOf((int) dims[0]), Integer.valueOf((int) dims[1])}); 
  18.             if (bmp == null) { 
  19.                 return null
  20.             } 
  21.             if (requiresRotation) { 
  22.                 Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels, heightPixels, Bitmap.Config.RGB_565); 
  23.                 Canvas c = new Canvas(ss); 
  24.                 c.translate((float) (ss.getWidth() / 2), (float) (ss.getHeight() / 2)); 
  25.                 c.rotate(degrees); 
  26.                 c.translate((-dims[0] / 2), (-dims[1] / 2)); 
  27.                 c.drawBitmap(bmp, 0, 0, null); 
  28.                 c.setBitmap(null); 
  29.                 bmp.recycle(); 
  30.                 bmp = ss; 
  31.             } 
  32.             if (bmp == null) { 
  33.                 return null
  34.             } 
  35.             bmp.setHasAlpha(false); 
  36.             bmp.prepareToDraw(); 
  37.             return bmp; 
  38.         } catch (Exception e) { 
  39.             e.printStackTrace(); 
  40.             return bmp; 
  41.         } 
  42.     } 

二、截屏手機里的監聽

利用FileObserver監聽某個目錄中資源變化情況;

利用ContentObserver監聽全部資源的變化;

ContentObserver:通過ContentObserver監聽圖片多媒體的變化,當手機上有新圖片文件產生時會通過MediaProvider類向圖片數據庫插入一條記錄,監聽圖片插入事件來獲得圖片的URI;

今天講的是通過ContentObserver實現;

1、ScreenShotHelper截屏幫助類

  1. /** 
  2.  * Description: 截屏幫助類 
  3.  */ 
  4. class ScreenShotHelper { 
  5.     companion object { 
  6.         const val TAG = "ScreenShotLog" 
  7.         /** 
  8.          * 讀取媒體數據庫時需要讀取的列 
  9.          */ 
  10.         val MEDIA_PROJECTIONS = arrayOf( 
  11.             MediaStore.Images.ImageColumns.DATA, 
  12.             MediaStore.Images.ImageColumns.DATE_TAKEN 
  13.         ) 
  14.         /** 
  15.          * 讀取媒體數據庫時需要讀取的列,其中 width、height 字段在 API 16 之后才有 
  16.          */ 
  17.         val MEDIA_PROJECTIONS_API_16 = arrayOf( 
  18.             MediaStore.Images.ImageColumns.DATA, 
  19.             MediaStore.Images.ImageColumns.DATE_TAKEN, 
  20.             MediaStore.Images.ImageColumns.WIDTH, 
  21.             MediaStore.Images.ImageColumns.HEIGHT 
  22.         ) 
  23.         /** 
  24.          * 截屏路徑判斷的關鍵字 
  25.          */ 
  26.         val KEYWORDS = arrayOf( 
  27.             "screenshot""screen_shot""screen-shot""screen shot"
  28.             "screencapture""screen_capture""screen-capture""screen capture"
  29.             "screencap""screen_cap""screen-cap""screen cap" 
  30.         ) 
  31.         fun showLog(msg: String) { 
  32.             Log.d(TAG, msg) 
  33.         } 
  34.     } 

2、監聽器ScreenShotListener

  1. /** 
  2.  * Description: 截屏監聽 
  3.  */ 
  4. class ScreenShotListener constructor(context: Context?) { 
  5.     private var mContext: Context 
  6.     private var mScreenRealSize: Point? = null 
  7.     private val mHasCallbackPaths: ArrayList<String> = ArrayList() 
  8.     private var mListener: OnScreenShotListener? = null 
  9.     private var mStartListenTime: Long = 0 
  10.     /** 
  11.      * 內部存儲器內容觀察者 
  12.      */ 
  13.     private var mInternalObserver: MediaContentObserver? = null 
  14.     /** 
  15.      * 外部存儲器內容觀察者 
  16.      */ 
  17.     private var mExternalObserver: MediaContentObserver? = null 
  18.     /** 
  19.      * 運行在 UI 線程的 Handler, 用于運行監聽器回調 
  20.      */ 
  21.     private var mUiHandler = Handler(Looper.getMainLooper()) 
  22.     init { 
  23.         ScreenShotHelper.showLog("init"
  24.         assertInMainThread() 
  25.         requireNotNull(context) { "The context must not be null." } 
  26.         mContext = context 
  27.         if (mScreenRealSize == null) { 
  28.             mScreenRealSize = getRealScreenSize() 
  29.             if (mScreenRealSize != null) { 
  30.                 ScreenShotHelper.showLog("Screen Real Size: " + mScreenRealSize!!.x + " * " + mScreenRealSize!!.y) 
  31.             } else { 
  32.                 ScreenShotHelper.showLog("Get screen real size failed."
  33.             } 
  34.         } 
  35.     } 
  36.     /** 
  37.      * 單例 
  38.      */ 
  39.     companion object : SingletonHolder<ScreenShotListener, Context>(::ScreenShotListener) 
  40.     /** 
  41.      * 開啟監聽 
  42.      */ 
  43.     fun startListener() { 
  44.         assertInMainThread() 
  45.         // 記錄開始監聽的時間戳 
  46.         mStartListenTime = System.currentTimeMillis() 
  47.         // 創建內容觀察者 
  48.         mInternalObserver = 
  49.             MediaContentObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI, mUiHandler) 
  50.         mExternalObserver = 
  51.             MediaContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mUiHandler) 
  52.         // 注冊內容觀察者 
  53.         mContext.contentResolver.registerContentObserver( 
  54.             MediaStore.Images.Media.INTERNAL_CONTENT_URI, 
  55.             false
  56.             mInternalObserver 
  57.         ) 
  58.         mContext.contentResolver.registerContentObserver( 
  59.             MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
  60.             false
  61.             mExternalObserver 
  62.         ) 
  63.     } 
  64.     fun stopListener() { 
  65.         assertInMainThread() 
  66.         // 注銷內容觀察者 
  67.         if (mInternalObserver != null) { 
  68.             try { 
  69.                 mContext.contentResolver.unregisterContentObserver(mInternalObserver!!) 
  70.             } catch (e: Exception) { 
  71.                 e.printStackTrace() 
  72.             } 
  73.             mInternalObserver = null 
  74.         } 
  75.         if (mExternalObserver != null) { 
  76.             try { 
  77.                 mContext.contentResolver.unregisterContentObserver(mExternalObserver!!) 
  78.             } catch (e: Exception) { 
  79.                 e.printStackTrace() 
  80.             } 
  81.             mExternalObserver = null 
  82.         } 
  83.         // 清空數據 
  84.         mStartListenTime = 0 
  85.         mListener = null 
  86.     } 
  87.     /** 
  88.      * 處理媒體數據庫的內容改變 
  89.      */ 
  90.     fun handleMediaContentChange(contentUri: Uri) { 
  91.         var cursorCursor? = null 
  92.         try { 
  93.             cursor = mContext.contentResolver.query( 
  94.                 contentUri, 
  95.                 if (Build.VERSION.SDK_INT < 16) ScreenShotHelper.MEDIA_PROJECTIONS else ScreenShotHelper.MEDIA_PROJECTIONS_API_16, 
  96.                 nullnull
  97.                 "${MediaStore.Images.ImageColumns.DATE_ADDED} desc limit 1" 
  98.             ) 
  99.             if (cursor == null) { 
  100.                 ScreenShotHelper.showLog("Deviant logic."
  101.                 return 
  102.             } 
  103.             if (!cursor.moveToFirst()) { 
  104.                 ScreenShotHelper.showLog("Cursor no data."
  105.                 return 
  106.             } 
  107.             // 獲取各列的索引 
  108.             val dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA) 
  109.             val dateTakenIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN) 
  110.             var widthIndex = -1 
  111.             var heightIndex = -1 
  112.             if (Build.VERSION.SDK_INT >= 16) { 
  113.                 widthIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.WIDTH) 
  114.                 heightIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.HEIGHT) 
  115.             } 
  116.             // 獲取行數據 
  117.             val data = cursor.getString(dataIndex) 
  118.             val dateTaken = cursor.getLong(dateTakenIndex) 
  119.             var width = 0 
  120.             var height = 0 
  121.             if (widthIndex >= 0 && heightIndex >= 0) { 
  122.                 width = cursor.getInt(widthIndex) 
  123.                 height = cursor.getInt(heightIndex) 
  124.             } else { 
  125.                 val size = getImageSize(data) 
  126.                 width = size.x 
  127.                 height = size.y 
  128.             } 
  129.             // 處理獲取到的第一行數據 
  130.             handleMediaRowData(data, dateTaken, width, height) 
  131.         } catch (e: Exception) { 
  132.             ScreenShotHelper.showLog("Exception: ${e.message}"
  133.             e.printStackTrace() 
  134.         } finally { 
  135.             if (cursor != null && !cursor.isClosed) { 
  136.                 cursor.close() 
  137.             } 
  138.         } 
  139.     } 
  140.     private fun getImageSize(imagePath: String): Point { 
  141.         val options = BitmapFactory.Options() 
  142.         options.inJustDecodeBounds = true 
  143.         BitmapFactory.decodeFile(imagePath, options) 
  144.         return Point(options.outWidth, options.outHeight) 
  145.     } 
  146.     /** 
  147.      * 處理獲取到的一行數據 
  148.      */ 
  149.     private fun handleMediaRowData(data: String, dateTaken: Long, width: Int, height: Int) { 
  150.         if (checkScreenShot(data, dateTaken, width, height)) { 
  151.             ScreenShotHelper.showLog("ScreenShot: path = $data; size = $width * $height; date = $dateTaken"
  152.             if (mListener != null && !checkCallback(data)) { 
  153.                 mListener!!.onScreenShot(data) 
  154.             } 
  155.         } else { 
  156.             // 如果在觀察區間媒體數據庫有數據改變,又不符合截屏規則,則輸出到 log 待分析 
  157.             ScreenShotHelper.showLog("Media content changed, but not screenshot: path = $data; size = $width * $height; date = $dateTaken"
  158.         } 
  159.     } 
  160.     /** 
  161.      * 判斷指定的數據行是否符合截屏條件 
  162.      */ 
  163.     private fun checkScreenShot(data: String?, dateTaken: Long, width: Int, height: Int): Boolean { 
  164.         // 判斷依據一: 時間判斷 
  165.         // 如果加入數據庫的時間在開始監聽之前, 或者與當前時間相差大于10秒, 則認為當前沒有截屏 
  166.         if (dateTaken < mStartListenTime || System.currentTimeMillis() - dateTaken > 10 * 1000) { 
  167.             return false 
  168.         } 
  169.         // 判斷依據二: 尺寸判斷 
  170.         if (mScreenRealSize != null) { 
  171.             // 如果圖片尺寸超出屏幕, 則認為當前沒有截屏 
  172.             if (!(width <= mScreenRealSize!!.x && height <= mScreenRealSize!!.y) 
  173.                 || (height <= mScreenRealSize!!.x && width <= mScreenRealSize!!.y) 
  174.             ) { 
  175.                 return false 
  176.             } 
  177.         } 
  178.         // 判斷依據三: 路徑判斷 
  179.         if (data.isNullOrEmpty()) { 
  180.             return false 
  181.         } 
  182.         val lowerData = data.toLowerCase(Locale.getDefault()) 
  183.         // 判斷圖片路徑是否含有指定的關鍵字之一, 如果有, 則認為當前截屏了 
  184.         for (keyWork in ScreenShotHelper.KEYWORDS) { 
  185.             if (lowerData.contains(keyWork)) { 
  186.                 return true 
  187.             } 
  188.         } 
  189.         return false 
  190.     } 
  191.     /** 
  192.      * 判斷是否已回調過, 某些手機ROM截屏一次會發出多次內容改變的通知; <br></br> 
  193.      * 刪除一個圖片也會發通知, 同時防止刪除圖片時誤將上一張符合截屏規則的圖片當做是當前截屏. 
  194.      */ 
  195.     private fun checkCallback(imagePath: String): Boolean { 
  196.         if (mHasCallbackPaths.contains(imagePath)) { 
  197.             ScreenShotHelper.showLog("ScreenShot: imgPath has done; imagePath = $imagePath"
  198.             return true 
  199.         } 
  200.         // 大概緩存15~20條記錄便可 
  201.         if (mHasCallbackPaths.size >= 20) { 
  202.             for (i in 0..4) { 
  203.                 mHasCallbackPaths.removeAt(0) 
  204.             } 
  205.         } 
  206.         mHasCallbackPaths.add(imagePath) 
  207.         return false 
  208.     } 
  209.     /** 
  210.      * 獲取屏幕分辨率 
  211.      */ 
  212.     private fun getRealScreenSize(): Point? { 
  213.         var screenSize: Point? = null 
  214.         try { 
  215.             screenSize = Point() 
  216.             val windowManager = mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager 
  217.             val defaultDisplay = windowManager.defaultDisplay 
  218.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
  219.                 defaultDisplay.getRealSize(screenSize) 
  220.             } else { 
  221.                 try { 
  222.                     val mGetRawW = Display::class.java.getMethod("getRawWidth"
  223.                     val mGetRawH = Display::class.java.getMethod("getRawHeight"
  224.                     screenSize.set
  225.                         mGetRawW.invoke(defaultDisplay) as Int
  226.                         mGetRawH.invoke(defaultDisplay) as Int 
  227.                     ) 
  228.                 } catch (e: Exception) { 
  229.                     screenSize.set(defaultDisplay.width, defaultDisplay.height) 
  230.                     e.printStackTrace() 
  231.                 } 
  232.             } 
  233.         } catch (e: Exception) { 
  234.             e.printStackTrace() 
  235.         } 
  236.         return screenSize 
  237.     } 
  238.     private fun assertInMainThread() { 
  239.         if (Looper.myLooper() != Looper.getMainLooper()) { 
  240.             val stackTrace = Thread.currentThread().stackTrace 
  241.             var methodMsg: String? = null 
  242.             if (stackTrace != null && stackTrace.size >= 4) { 
  243.                 methodMsg = stackTrace[3].toString() 
  244.             } 
  245.             ScreenShotHelper.showLog("Call the method must be in main thread: $methodMsg"
  246.         } 
  247.     } 
  248.     /** 
  249.      * 媒體內容觀察者 
  250.      */ 
  251.     private inner class MediaContentObserver(var contentUri: Uri, handler: Handler) : 
  252.         ContentObserver(handler) { 
  253.         override fun onChange(selfChange: Boolean) { 
  254.             super.onChange(selfChange) 
  255.             handleMediaContentChange(contentUri) 
  256.         } 
  257.     } 
  258.     /** 
  259.      * 設置截屏監聽器回調 
  260.      */ 
  261.     fun setListener(listener: OnScreenShotListener) { 
  262.         this.mListener = listener 
  263.     } 
  264.     /** 
  265.      * 截屏監聽接口 
  266.      */ 
  267.     interface OnScreenShotListener { 
  268.         fun onScreenShot(picPath: String) 
  269.     } 

3、使用

  1. class ScreenShotActivity : AppCompatActivity() { 
  2.     private lateinit var screenShotListener: ScreenShotListener 
  3.     var isHasScreenShotListener = false 
  4.     override fun onCreate(savedInstanceState: Bundle?) { 
  5.         super.onCreate(savedInstanceState) 
  6.         setContentView(R.layout.activity_screen_shot) 
  7.         screenShotListener = ScreenShotListener.getInstance(this) 
  8.         // 申請權限 
  9.         val permission = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) 
  10.         if (ActivityCompat.checkSelfPermission( 
  11.                 this, 
  12.                 Manifest.permission.READ_EXTERNAL_STORAGE 
  13.             ) != PackageManager.PERMISSION_GRANTED 
  14.         ) { 
  15.             ActivityCompat.requestPermissions(this, permission, 1001) 
  16.         } 
  17.     } 
  18.     override fun onRequestPermissionsResult( 
  19.         requestCode: Int
  20.         permissions: Array<out String>, 
  21.         grantResults: IntArray 
  22.     ) { 
  23.         super.onRequestPermissionsResult(requestCode, permissions, grantResults) 
  24.         if (requestCode == 1001) { 
  25.             if (grantResults[0] == PermissionChecker.PERMISSION_GRANTED) { 
  26.                 customToast("權限申請成功"
  27.             } else { 
  28.                 customToast("權限申請失敗"
  29.             } 
  30.         } 
  31.     } 
  32.     override fun onResume() { 
  33.         super.onResume() 
  34.         startScreenShotListen() 
  35.     } 
  36.     override fun onPause() { 
  37.         super.onPause() 
  38.         stopScreenShotListen() 
  39.     } 
  40.     private fun startScreenShotListen() { 
  41.         if (!isHasScreenShotListener) { 
  42.             screenShotListener.setListener(object : ScreenShotListener.OnScreenShotListener { 
  43.                 override fun onScreenShot(picPath: String) { 
  44.                     customToast("監聽截屏成功"
  45.                     Log.d(ScreenShotHelper.TAG, picPath) 
  46.                 } 
  47.             }) 
  48.             screenShotListener.startListener() 
  49.             isHasScreenShotListener = true 
  50.         } 
  51.     } 
  52.     private fun stopScreenShotListen() { 
  53.         if (isHasScreenShotListener) { 
  54.             screenShotListener.stopListener() 
  55.             isHasScreenShotListener = false 
  56.         } 
  57.     } 

注意點:

  • 若要監聽整個APP的所有頁面,則將監聽器加入到BaseActivity,在頁面的onResume中開啟監聽,在onPause停止監聽;
  • 需要讀取內部存儲(READ_EXTERNAL_STORAGE)權限;

總結

截屏還有滾動,以后會介紹實現方式;努力進步學習;

本文轉載自微信公眾號「Android開發編程」

 

責任編輯:姜華 來源: Android開發編程
相關推薦

2020-12-21 16:35:51

JavaScript網頁截屏代碼

2023-07-25 10:45:48

OHScrcpy鴻蒙

2021-08-05 16:36:16

Windows 11操作系統微軟

2021-08-08 14:15:30

Windows 11Windows微軟

2011-07-21 15:56:32

iPhone 截屏

2011-07-25 14:44:41

iPhone iPhone開發 截屏

2017-01-11 18:36:04

Android矩形區域截屏移動開發

2009-12-23 14:10:23

Linux截屏工具

2011-05-18 14:24:38

2017-03-10 14:23:18

Windows 10Windows截屏

2014-06-16 09:28:08

Linux命令行

2021-02-11 13:56:21

JSweb插件

2016-01-20 13:08:33

2017-12-11 09:04:53

LinuxScrot截屏

2018-04-24 13:40:59

Python盜號原理截圖

2020-02-03 10:10:05

Windows 10技巧Windows

2018-10-15 10:42:17

Linux截屏工具

2013-10-24 14:24:17

搜狗輸入法

2020-02-24 09:45:02

Bash截Linux系統配置

2010-02-24 14:50:33

Ubuntu vim
點贊
收藏

51CTO技術棧公眾號

欧美日韩国产一区中文午夜| 麻豆精品视频在线观看视频| 亚洲精品黄网在线观看| 人人妻人人做人人爽| 性xxxx视频| 日韩精品午夜视频| 少妇av一区二区三区| 一级黄色免费毛片| а√在线天堂官网| 久久美女艺术照精彩视频福利播放 | 国产精品视频久久久久久| 国产精品国产三级国产在线观看| 色av一区二区| www.亚洲一区二区| 欧洲av在线播放| 日韩电影一区二区三区四区| 久久亚洲精品成人| 男男做爰猛烈叫床爽爽小说| 日本一区二区三区视频在线| 一区二区三区小说| 日韩不卡av| 国产视频一二三四区| 国产一区导航| 乱亲女秽乱长久久久| 国产一级二级在线观看| 国产一区二区三区国产精品| 狠狠色狠狠色综合日日小说| 亚洲一区二区免费视频软件合集| 手机看片1024日韩| 老鸭窝一区二区久久精品| 久久久久久国产精品三级玉女聊斋 | 欧美日韩喷水| 性一交一乱一色一视频麻豆| 日韩av网站在线观看| 欧美成人精品在线| 亚洲ⅴ国产v天堂a无码二区| 国产精品对白| 日韩午夜在线观看视频| 成人3d动漫一区二区三区| 僵尸再翻生在线观看| 亚洲欧美日韩人成在线播放| 四虎永久在线精品免费一区二区| 色鬼7777久久| av日韩在线网站| 99国产超薄肉色丝袜交足的后果| 中文在线免费看视频| 久久久久99| 91国内揄拍国内精品对白| 午夜激情福利网| 精品国产一区探花在线观看| 日韩av一区二区在线| 性生活在线视频| 成人av色网站| 91久久精品国产91性色tv| 欧美日韩一道本| 尤物网在线观看| 欧美国产综合色视频| 欧美欧美一区二区| 天天操天天操天天操| 国产成人鲁色资源国产91色综| 91久久精品美女高潮| 老熟妇一区二区三区啪啪| 久久久久久一区二区| 欧美俄罗斯乱妇| 午夜精品一区二区三区视频| 99视频精品全部免费在线视频| 怡红院精品视频| 国产精品久久久久无码av色戒| 欧美美女啪啪| 日韩的一区二区| aaaaa一级片| 日本午夜精品| 亚洲精选一区二区| 成人免费网站黄| 久草在线成人| 国产亚洲成精品久久| 国产黄片一区二区三区| 欧洲三级视频| 日韩中文字幕在线免费观看| 日韩一卡二卡在线观看| 色综合久久一区二区三区| 中文字幕日韩欧美精品在线观看| 中国1级黄色片| 婷婷中文字幕一区| 欧美激情xxxxx| 日本在线观看中文字幕| 影音先锋一区| 欧美中文在线观看| 中文有码在线播放| 蜜臀av性久久久久蜜臀aⅴ| 国产一区二区丝袜| 精品毛片一区二区三区| 99久免费精品视频在线观看| 久久波多野结衣| 久久综合九色综合久| 久久精品一区八戒影视| 亚洲一二区在线| 日本大片在线播放| 欧美日韩在线免费观看| 亚洲第一狼人区| 91精品亚洲一区在线观看| 欧美成人综合网站| 法国伦理少妇愉情| 欧美国产一区二区三区激情无套| 美女久久久久久久| 天天综合网久久综合网| 另类专区欧美蜜桃臀第一页| 97超碰人人模人人爽人人看| 亚洲av片在线观看| 国产精品久久久久影院| 国产中文字幕视频在线观看| 国产激情综合| 在线看福利67194| 激情五月色婷婷| 九色综合狠狠综合久久| 国模精品娜娜一二三区| 午夜小视频在线| 亚洲18色成人| 一级黄色片国产| 日韩理论电影中文字幕| 精品国产区一区二区三区在线观看| 中文字幕在线观看免费视频| 久久超碰97人人做人人爱| 国产伦精品一区二区三区高清版 | 欧美久久一区二区| 一出一进一爽一粗一大视频| 911久久香蕉国产线看观看| 2019中文字幕在线| 精品国产伦一区二区三区| 久久免费看少妇高潮| 国产资源在线免费观看| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 欧美日韩国产精品成人| 日本免费a视频| 国产精品成人国产| 亚洲天堂2020| 国产亚洲精久久久久久无码77777| 首页国产欧美日韩丝袜| 国产在线精品一区| av在线免费观看网址| 欧洲人成人精品| 少妇精品无码一区二区三区| 欧美三级网页| 国产精品视频久久久| 色呦呦中文字幕| 亚洲午夜久久久久久久久久久 | 人人精品人人爱| 久久综合伊人77777麻豆| 国产乱码在线| 欧美福利电影网| 中国特黄一级片| 免费在线观看日韩欧美| 亚洲mv在线看| 日本成人一区二区| 在线一区二区日韩| 国产剧情在线视频| 久久综合九色综合欧美亚洲| 欧美 丝袜 自拍 制服 另类| xvideos.蜜桃一区二区| 欧美成人全部免费| 国产免费av电影| 亚洲人成人一区二区在线观看| 日本黄大片一区二区三区| 第一会所sis001亚洲| 2019中文字幕在线| 四虎国产精品永远| 精品久久久在线观看| 欧美做受高潮中文字幕| 1024精品一区二区三区| 国产自产精品| 日韩av福利| 日韩视频在线一区| 亚洲欧美黄色片| 午夜精品久久久久影视| 大又大又粗又硬又爽少妇毛片| 老鸭窝毛片一区二区三区| 日本一区二区三区免费看| 天天综合网天天| 日韩性生活视频| 国产口爆吞精一区二区| 一区二区三区中文免费| 波多野结衣电影免费观看| 欧美福利影院| 国产精品日韩二区| 亚洲人成午夜免电影费观看| 亚洲欧洲国产一区| 精品人妻一区二区三区潮喷在线 | 人妻少妇一区二区| 美女一区二区三区| 中文字幕欧美日韩一区二区三区| 欧美视频精品全部免费观看| 欧美—级a级欧美特级ar全黄| 欧美一区二区三区激情| 午夜电影网亚洲视频| 日韩精品电影一区二区| 国产一区二区美女| 欧美黄网站在线观看| 欧美一区电影| 亚洲在线www| 久草免费在线视频| 日韩中文字幕免费看| 欧洲精品久久一区二区| 日本二三区不卡| 五月天av网站| 91在线精品一区二区| 自拍偷拍一区二区三区四区| 欧美涩涩视频| 六十路精品视频| www.久久爱.com| 欧美亚洲伦理www| 国产精品久久麻豆| 日韩电视剧在线观看免费网站| 在线观看国产小视频| 亚洲成av人片一区二区三区| 国产又粗又黄又猛| 99免费精品视频| 在线播放黄色av| 久久狠狠一本精品综合网| 国产精品一二三在线观看| 免费视频国产一区| 91亚洲精品久久久| 日韩精选视频| 亚洲97在线观看| av毛片在线播放| 日韩在线小视频| 91社区在线观看播放| 亚洲精品国精品久久99热| 国产乱码精品一区二区| 欧美性色视频在线| 久草视频在线资源| 综合色天天鬼久久鬼色| 99久久精品免费视频| av成人动漫在线观看| 亚洲天堂伊人网| 日日夜夜一区二区| 国产精品333| 亚洲特级毛片| 男人的天堂视频在线| 日韩欧美不卡| 任我爽在线视频精品一| 盗摄牛牛av影视一区二区| 91免费看片在线| 波多野结衣亚洲| 性欧美xxxx交| 欧美xxxx性xxxxx高清| www.亚洲成人| 电影av一区| 亚洲午夜激情免费视频| 日本人妖在线| 亚洲美女自拍视频| 亚洲精品久久久久久无码色欲四季 | 黑人巨大精品欧美一区二区小视频 | 成人一二三四区| 一本大道av伊人久久综合| 久久黄色精品视频| 欧美小视频在线| 国产精品 欧美 日韩| 亚洲国产欧美另类丝袜| 国产第一页第二页| 一区二区三区不卡视频在线观看| 能直接看的av| 国产精品私房写真福利视频| 国产在线免费av| 久久久蜜臀国产一区二区| 青青草福利视频| 日本一区二区三区dvd视频在线 | 天堂成人免费av电影一区| 成人在线观看你懂的| 制服诱惑一区二区| 欧美v在线观看| 久久成人一区| www.精品在线| 日批视频在线播放| 日韩午夜在线观看视频| 最新中文字幕第一页| 欧美偷拍一区二区| 91丨九色丨丰满| 正在播放一区二区| 午夜精品久久久久久久96蜜桃| 欧美一级生活片| 黄色一级大片在线免费看国产| 亚洲国产精品久久久久秋霞蜜臀| 四虎电影院在线观看| 亚洲欧美综合图区| 国产精品一卡二卡三卡| 久久久亚洲国产| 制服诱惑亚洲| 亚洲尤物视频网| 亚洲人成网亚洲欧洲无码| 日日夜夜精品网站| 欧美二区视频| 超碰影院在线观看| 国产成人免费在线观看| 人妻aⅴ无码一区二区三区| 最新热久久免费视频| 日韩伦理在线视频| 欧美日韩免费高清一区色橹橹 | 亚洲色图视频免费播放| 日韩欧美一区二区一幕| 欧美日本一区二区三区| 亚洲日本在线播放| 久久久久999| 午夜精品成人av| 超碰97人人在线| 日韩欧美视频| 欧美精品一区免费| 国产精品一区在线| 国产美女网站视频| 日韩欧美综合在线视频| 国产黄频在线观看| 三级精品视频久久久久| 超级碰碰久久| 成人自拍视频网站| 亚欧美无遮挡hd高清在线视频 | 日本不卡二区高清三区| 亚洲天堂黄色| 亚洲制服在线观看| 国产精品久久国产精麻豆99网站| 男人日女人网站| 亚洲第一天堂av| 直接在线观看的三级网址| 国产狼人综合免费视频| 国产免费久久| 人妻有码中文字幕| 91视频.com| 日韩激情在线播放| 精品三级在线看| 国产理论在线观看| 成人中文字幕+乱码+中文字幕| 日产午夜精品一线二线三线| 虎白女粉嫩尤物福利视频| 99亚偷拍自图区亚洲| 日本少妇激情视频| 亚洲精品一区二区三区精华液| 怡红院av在线| 91在线短视频| 精品动漫3d一区二区三区免费版 | 中文字幕第三页| 亚洲天堂av在线免费观看| 欧美舌奴丨vk视频| 欧美激情论坛| 久久亚洲不卡| 一区二区伦理片| 91久久线看在观草草青青| 麻豆导航在线观看| 日韩av不卡电影| 国产精品欧美日韩一区| 88av.com| 国产精品乱码人人做人人爱| 伊人精品一区二区三区| 日韩中文字在线| 久久久久毛片免费观看| www插插插无码免费视频网站| 国产传媒久久文化传媒| 久久午夜无码鲁丝片午夜精品| 精品国产一区二区精华| yellow字幕网在线| 美媛馆国产精品一区二区| 日韩影院免费视频| 任你操精品视频| 欧美一二三区精品| 不卡视频观看| 日韩欧美精品在线不卡| 久草这里只有精品视频| 欧美激情国产精品免费| 亚洲成人精品av| 韩漫成人漫画| 在线成人av电影| 成人一二三区视频| 黄瓜视频在线免费观看| 中文字幕亚洲第一| 日本在线视频一区二区三区| 亚洲 自拍 另类小说综合图区| 久久久www成人免费毛片麻豆 | 国内精品写真在线观看| 免费在线一级片| 亚洲色图15p| 欧美第一在线视频| 成人在线免费在线观看| 国产精品久久毛片a| 精品国产乱码一区二区三| 欧美一级黄色网| 99精品一区| 精品黑人一区二区三区观看时间| 欧美性受xxxx黑人xyx性爽| 香蕉成人app免费看片| 日本不卡久久| 豆国产96在线|亚洲| 国产精品xxxxxx| 欧美激情性做爰免费视频| 极品美女一区二区三区| 国产ts在线观看| 欧美色手机在线观看| 99riav视频在线观看| 偷拍盗摄高潮叫床对白清晰| 99re8在线精品视频免费播放| 国产农村妇女毛片精品| 日韩av电影免费观看高清| 欧美亚韩一区| 久久爱一区二区|