精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品亚洲欧美日韩一区在线| 三级无遮挡在线观看| 欧美在线免费| 日韩成人小视频| 天天爽夜夜爽一区二区三区| av香蕉成人| 久久综合久久综合亚洲| 成人网在线视频| 久久久久久久久影院| 999精品视频| 亚洲国产天堂久久综合网| 黄色在线视频网| av最新在线| 日韩一区在线播放| 欧美日韩精品一区| 黄频在线免费观看| 久久99精品视频| 91国内在线视频| 精品自拍偷拍视频| av亚洲在线观看| 亚洲电影第1页| 亚洲精品视频三区| 亚洲www.| 亚洲成人在线网站| 青青草影院在线观看| 日韩电影免费| 成人午夜视频在线| 亚洲在线免费视频| 中文字幕在线一| 性xx色xx综合久久久xx| 久久久女女女女999久久| wwwww黄色| 国产精品美女久久久久久不卡| 日韩欧美国产高清| 免费av不卡在线| 精品裸体bbb| 色综合久久88色综合天天6| 日韩欧美不卡在线| 久久香蕉一区| 一区二区三区在线影院| 在线观看国产一区| 最新电影电视剧在线观看免费观看| 99re成人在线| 国产一区再线| 日韩在线一区二区三区四区| 国产乱色国产精品免费视频| 成人免费福利在线| 在线免费观看一级片| 日韩成人一区二区三区在线观看| 91av视频在线免费观看| 亚洲一区 视频| 日韩视频三区| 97在线日本国产| 久久午夜免费视频| 亚洲影音一区| 国产精品成人aaaaa网站| 亚洲自拍一区在线观看| 久久精品官网| 国产精品久在线观看| www.久久视频| 麻豆精品一区二区三区| 国产日本欧美一区二区三区| 亚洲无码精品在线播放| 黄色资源网久久资源365| 成人免费看吃奶视频网站| 国产免费久久久| 成人精品视频一区| 狠狠色噜噜狠狠色综合久| 婷婷五月综合激情| 久久一区二区三区四区| 日韩精品另类天天更新| 天堂中文а√在线| 亚洲夂夂婷婷色拍ww47| 欧美精品久久久久久久免费| 韩国久久久久久| 欧美日韩一区在线观看| 中文字幕55页| 秋霞影视一区二区三区| 亚洲视频在线观看免费| 免费成人美女女在线观看| 欧美色综合网| 热re99久久精品国产66热| 亚洲精品毛片一区二区三区| 国产一区二区三区在线观看精品 | 欧美午夜免费| 91在线导航| 一区二区欧美精品| 久久美女福利视频| 成人影院网站ww555久久精品| 欧美成人精品福利| xxx在线播放| 91精品国产91久久久久久黑人| 欧美激情性做爰免费视频| 天天操夜夜操视频| 激情欧美一区二区| 久久国产日韩欧美| 超碰porn在线| 日本久久精品电影| 99国产精品免费视频| 日韩有码中文字幕在线| 久久精品中文字幕| 中文字幕精品无码一区二区| 国产伦精品一区二区三区免费迷| 久久亚洲精品欧美| av片在线观看免费| 在线观看免费成人| 亚洲精品激情视频| 欧美r级电影| 57pao成人国产永久免费| 91福利在线观看视频| 91亚洲精品久久久蜜桃| 女女百合国产免费网站| 666av成人影院在线观看| 欧美sm美女调教| 91禁男男在线观看| 久久久久99| 国产精品日韩一区二区免费视频| av二区在线| 一本色道**综合亚洲精品蜜桃冫 | 97成人超碰视| 污污污污污污www网站免费| 免费在线成人激情电影| 日韩理论片久久| 久久伊人成人网| 精品一区二区久久| 五月天亚洲综合| 欧美成人ⅴideosxxxxx| 亚洲精品国产综合区久久久久久久| 国产第一页浮力| 麻豆久久久久久久| 午夜精品一区二区三区四区| 中文在线最新版地址| 亚洲第一在线视频| 日本三级欧美三级| heyzo一本久久综合| 成人短视频在线观看免费| 日本黄色成人| 北条麻妃99精品青青久久| 综合久久中文字幕| 欧美韩日一区二区三区| 亚洲视频在线a| 国产一区网站| 国产精品∨欧美精品v日韩精品| 日韩一级片免费看| 狠狠爱在线视频一区| 一起草在线视频| 在线一区免费观看| 精品久久久久久综合日本| 麻豆免费在线| 日韩精品黄色网| 看片网址国产福利av中文字幕| 成人毛片视频在线观看| 成人黄色大片网站| 国产精品乱战久久久| 亚洲2020天天堂在线观看| 婷婷五月综合久久中文字幕| 欧美日韩免费看| 亚洲一区二区三区综合| 久久国产高清| 亚洲精品一品区二品区三品区| 国产情侣一区二区三区| www.日韩欧美| www.久久精品.com| 五月天激情小说综合| 丰满少妇在线观看资源站| 蜜桃伊人久久| 亚洲国产精品综合| 国产免费区一区二区三视频免费 | 亚洲精品国产精品久久清纯直播| √资源天堂中文在线| 国产区在线观看成人精品| 一路向西2在线观看| 亚洲高清影视| 精品在线一区| 欧美综合社区国产| 欧美极品欧美精品欧美视频| 深夜福利在线视频| 在线看一区二区| 欧美激情精品久久久久久免费| 国产精品自在欧美一区| 午夜精品久久久久久久无码| 国产一区二区精品福利地址| 成人免费视频网| 国产中文在线播放| 日韩在线小视频| 黄频网站在线观看| 欧美日韩精品一区二区三区| 久久久久久久久99| 久久精品夜色噜噜亚洲aⅴ| 一区二区久久精品| 国产精品日本| 400部精品国偷自产在线观看| 麻豆精品av| 91久久精品美女高潮| 黄在线观看免费网站ktv| 色狠狠久久aa北条麻妃| 人妻一区二区三区四区| 欧美日韩免费在线视频| 日韩精品成人在线| 亚洲欧美在线视频| 婷婷色一区二区三区| 国产sm精品调教视频网站| 亚洲黄色小视频在线观看| 激情自拍一区| 亚洲区成人777777精品| 欧美女王vk| 国产日韩一区欧美| 2019中文亚洲字幕| 国产精品青草久久久久福利99| 伊人福利在线| 最新日韩中文字幕| 欧美日韩影视| 亚洲精品v欧美精品v日韩精品| 国产又粗又猛又爽又黄的视频一| 欧美日韩在线免费观看| 久久一二三四区| 亚洲三级免费电影| 调教驯服丰满美艳麻麻在线视频| 成人精品国产福利| 一区二区在线免费观看视频| 久久超碰97人人做人人爱| 日本一本二本在线观看| 亚洲久久在线| 激情小视频网站| 欧美a级片一区| 熟女视频一区二区三区| 日韩精品影视| 亚洲精品9999| 精品国产乱码| 日本不卡免费新一二三区| 秋霞综合在线视频| 国偷自产av一区二区三区小尤奈| 日本免费一区二区视频| 91麻豆桃色免费看| 日韩三级成人| 国产日韩在线看| 国产精品99久久久久久董美香| 欧美做受高潮电影o| 欧美巨大丰满猛性社交| 国外成人在线播放| av资源中文在线| 国内精久久久久久久久久人| 爱福利在线视频| 久久久久久午夜| 爱啪啪综合导航| 97精品视频在线| 在线天堂资源| 欧美中文字幕在线观看| 性感女国产在线| 国产91色在线|| 国产成人精品一区二区三区免费| 国产成人中文字幕| 黄色成人小视频| 91精品视频免费看| 日韩成人精品| 国产精品一区视频| 亚洲裸色大胆大尺寸艺术写真| 久久国产日韩欧美| 成人同人动漫免费观看| 制服国产精品| 欧美日韩久久| 337p粉嫩大胆噜噜噜鲁| 久久久久久黄| 久久久久xxxx| 高清av一区二区| 免费成人深夜夜行p站| 国产亚洲欧美日韩在线一区| 在线观看免费小视频| 亚洲视频1区2区| 日韩av在线天堂| 91久久久免费一区二区| 自拍偷拍校园春色| 91精品婷婷国产综合久久| 乱精品一区字幕二区| 亚洲欧美制服第一页| 麻豆tv入口在线看| 久久久爽爽爽美女图片| 在线国产成人影院| 亚洲在线观看视频网站| 色天天色综合| 最新不卡av| 国产日韩免费| 亚洲精品在线视频播放| 99热国产精品| 我要看黄色一级片| 精品色蜜蜜精品视频在线观看| 超碰在线97观看| 欧美哺乳videos| 中文字幕日本在线| 久久久久久网站| 99er精品视频| 久久一区免费| 日本欧美精品久久久| 欧美日韩中文| 亚洲不卡视频在线| a在线欧美一区| 久久国产波多野结衣| 色综合色狠狠综合色| 国产人妻精品一区二区三区| 亚洲美女性视频| 伊人精品影院| 国产九九精品视频| 香蕉成人app| 亚洲图片都市激情| 国产欧美高清| 欧美69精品久久久久久不卡| 国产女主播视频一区二区| 精品在线免费观看视频| 欧美电影一区二区三区| 极品白浆推特女神在线观看 | 亚洲国产精品人人爽夜夜爽| 2021av在线| 啪一啪鲁一鲁2019在线视频| 视频一区中文字幕精品| 亚洲第一综合| 久久久精品日韩| 制服丝袜第二页| 亚洲高清中文字幕| 精品国产一级片| 日韩中文字幕精品| 韩国成人在线| 欧美乱偷一区二区三区在线| 亚洲天天综合| 日韩成人av免费| 国产精品丝袜黑色高跟| 无码人妻精品一区二区三区蜜桃91 | 国产肥臀一区二区福利视频| 国产91露脸合集magnet| 在线看的片片片免费| 欧美男人的天堂一二区| 成年人免费在线视频| 国产精品久久久久久久av大片| 丝袜美腿综合| 日日摸日日碰夜夜爽av| 91污在线观看| 天天操夜夜操视频| 亚洲欧洲中文天堂| 日本免费久久| 欧美日韩精品免费观看视一区二区| 先锋影音久久久| 国产麻豆天美果冻无码视频| 欧美三级xxx| 日本免费不卡| 国产成人黄色av| 成人精品久久| 国产传媒免费观看| 亚洲欧美aⅴ...| 国产人妖一区二区三区| 欧美成人亚洲成人| 亚洲1区在线| 色欲色香天天天综合网www| jiyouzz国产精品久久| 亚洲永久精品在线观看| 亚洲午夜精品久久久久久久久久久久 | 隣の若妻さん波多野结衣| 欧美精品久久久久a| 久草在线综合| 久草综合在线观看| 中文字幕中文字幕在线一区| 国产精品女同一区二区| 欧美成人合集magnet| 精品亚洲免a| 久久9精品区-无套内射无码| 国产午夜精品理论片a级大结局| 无码久久精品国产亚洲av影片| 中文字幕亚洲一区二区三区| gogo大尺度成人免费视频| 国产精品国产三级国产专区51| 处破女av一区二区| 亚洲图片在线视频| 色婷婷综合久久久久| 911精品国产| 免费无码av片在线观看| 中文字幕一区av| 亚洲第九十九页| 日本精品一区二区三区在线| 久久国产成人精品| 美女网站视频在线观看| 91久久久免费一区二区| 50度灰在线| 欧美另类视频在线| 国产一区二区美女| 天堂在线免费观看视频| 久久激情五月丁香伊人| 老司机在线精品视频| 在线免费观看av的网站| 亚洲小说欧美激情另类| 成人性生交大片免费看午夜| 91免费在线观看网站| 日日欢夜夜爽一区| 免费无遮挡无码永久在线观看视频| 亚洲精选中文字幕| 国产成人免费av一区二区午夜 | 桃色一区二区| 超薄肉色丝袜足j调教99| 91美女片黄在线观看| 99热这里只有精品1| 国产成人久久久精品一区| 欧美日本一区| 国产成人一区二区在线观看|