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

實現一個Android鎖屏App的難點總結

移動開發 Android
自定義一個漂亮實用的鎖屏app,如果能贏得用戶的認可,替換系統自帶的鎖屏,絕對是一個不小的日活入口。這段時間正好總結一下最近調研的Android平臺的鎖屏app開發中的難點。

自定義一個漂亮實用的鎖屏app,如果能贏得用戶的認可,替換系統自帶的鎖屏,絕對是一個不小的日活入口。這段時間正好總結一下最近調研的Android平臺的鎖屏app開發中的難點。

一、前言

鎖屏的大概實現原理都很簡單。監聽系統的亮屏廣播,在亮屏的時候展示自己的鎖屏界面,用戶在鎖屏界面上進行一系列的動作才能解鎖。有的手機啟動鎖屏界面的過程會很卡,所以會明顯看到亮屏之后鎖屏界面的啟動有延時,因此也可以選擇監聽系統滅屏的廣播,屏幕關掉的時候就將鎖屏界面準備好,直接亮屏展示(滅屏后你的app會比較容易被殺死,這點要注意做保活)。

還需要注意,亮屏和滅屏廣播,SCREEN_ON/SCREEN_OFF都是只能動態監聽的,所以要另開一個Service來注冊,這個Service的自啟動和保活也要做好。

基本的實現細節就不多講了,這篇文章只會講遇到的幾個難點。

二、鎖屏實現中的難點

1.屏蔽Home鍵

既然是鎖屏界面,當然只能通過界面上的一些滑動或者輸入動作來解開鎖屏,不能簡單的直接被Home鍵一按,就解開了。從4.0開始,Home直接在framework層就被系統響應到,強退到桌面,第三方應用里已經無法再通過Activity.onKeyDown方法來監聽和攔截Home鍵,盡管還象征性的保留了Home鍵的KeyCode來向前兼容,但是Home鍵按下去,并不會回調這個方法。

除了onKeyDown,有沒有其他辦法監聽Home鍵,有的。前臺App退到后臺會有廣播ACTION_CLOSE_SYSTEM_DIALOGS,收到廣播攜帶的intent之后,解析里面的"reason"參數,就可以知道退出原因是什么了。home鍵按下后,reason是"homekey",最近任務鍵按下后,reason是"recentapps"。

這當然不是最終方案,因為有些三星ROM里并不會有這個廣播。而且廣播的意思只是通知你一下,人家framework層已經把你的應用退回桌面了,你能監聽home鍵,但沒有辦法攔截home鍵。也許想到了可以監聽到home鍵的時候,馬上把自己的Activity又重新打開展示,我試了一下,home鍵按下后startActivity會有延時3秒左右,這應該是Google早就想到了我們會這么干,做了這么一個延時方案。

直接攔截行不通了,想想別的路子。按Home鍵是讓系統退回到Launcher(即桌面啟動器),那么如果我們的鎖屏Activity本身就是Launcher的話,那按Home鍵不就等于回到我們的鎖屏Activity,也就可以阻止它把鎖屏Activity關掉了。

怎么把自己的Activity聲明為Launcher,在Activity中添加intent-filter:

  1. <intent-filter> 
  2.  
  3. <action android:name="android.intent.action.MAIN" /> 
  4.  
  5. <category android:name="android.intent.category.HOME" /> 
  6.  
  7. <category android:name="android.intent.category.DEFAULT" /> 
  8.  
  9. </intent-filter>  

這樣,新安裝的app會是一個能夠作為launcher的app,所以首次按Home鍵的時候,就會有彈窗提示你選擇要進入哪個launcher,選擇我們自己的Activity,這樣home鍵就被我們接管了。

不過這樣有一個很明顯的問題,如果不在我們的鎖屏界面按Home鍵,同樣會進入到鎖屏Activity。當然,解決的方式也簡單,當我們按Home時進入鎖屏Activity的onCreate里做一個判斷,如果前一個前臺Activity是鎖屏Activity,那就不用對Home鍵處理,如果不是鎖屏Activity,那就要關閉鎖屏Activity,跳到用戶真正的桌面啟動器去了。真正的桌面啟動器是哪一個,我們可以這樣來找:

  1. List<String> pkgNamesT = new ArrayList<String>(); 
  2. List<String> actNamesT = new ArrayList<String>(); 
  3. List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);   
  4. for (int i = 0; i < resolveInfos.size(); i++) { 
  5.     String string = resolveInfos.get(i).activityInfo.packageName; 
  6.     if (!string.equals(context.getPackageName())) {//自己的launcher不要       
  7.         pkgNamesT.add(string); 
  8.         string = resolveInfos.get(i).activityInfo.name
  9.         actNamesT.add(string); 
  10.     } 
  11.  

如果實際的launcher只有一個,那直接跳轉過去就可以了:

  1. ComponentName componentName = new ComponentName(pkgName, actName);  
  2. Intent intent = new Intent();  
  3. intent.setComponent(componentName);  
  4. context.startActivity(intent);  
  5. ((Activity) context).finish();  

如果手機安裝有多個launcher(如360桌面一類的app)就會麻煩一點,需要展示一個列表讓用戶來選取用哪個launcher,這個在產品形態上可能會讓用戶覺得有點不解。

現在,如果在其他APP里按一下Home鍵,會跳到我們的鎖屏Activity然后跳轉到真正的launcher。這里可能會有Activity閃現一下的場景,影響用戶體驗。最優的辦法其實是另外弄一個Activity來作為Home鍵跳轉的Activity,這個Activity設為透明的,就不會被用戶感知。如此,產品形態就變成了,鎖屏Activity中按Home鍵,跳轉到透明Activity,跳轉回鎖屏Activity,相當于Home鍵無效;其他APP中按Home鍵,跳轉到透明Activity,跳轉到真正的桌面。

實現透明的Activity,只需要在xml中聲明

  1. android:theme="@android:style/Theme.Translucent.NoTitleBar" 

這樣的界面是透明的,實際上有占位在屏幕的頂層,所以跳轉后記得要finish掉,不然會阻斷跳轉后的界面的交互。另外,Theme.NoDisplay也能將Activity設置為不可見,而且不占位,但是筆者實現的時候發現,NoDisplay的Activity無法被系統設置為launcher(設置后會彈窗讓你重新設置,如此反復)

2.懸浮窗的實現方式

由于受Home鍵無法直接攔截的限制,Activity實現的鎖屏會需要繞較多的路。所以有的鎖屏應用會使用懸浮窗來實現,懸浮窗能夠無視Home鍵,在按下home鍵的時候不會退到后臺。所以不需要在home鍵的問題上糾結。懸浮窗統一由WindowManager來管理,具體的實現比較簡單,筆者就不贅述了,有個坑要注意,懸浮窗需要聲明權限:

  1. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

有的手機設置里,默認是不給應用授權懸浮窗使用權的,所以應用里還要考慮引導用戶授權懸浮窗使用。

此外,有些應急解鎖的場景,比如來電接聽,鬧鈴處理,對于Activity實現的鎖屏界面,系統會自動把所有的前臺Activity隱藏,讓用戶直接去處理這些場景。但是懸浮窗會蓋住場景,所以遇到這些場景,懸浮窗實現的鎖屏界面要自己去處理這些特殊場景的自動解鎖。

3.禁用系統鎖屏

有了自己的鎖屏界面,還需要禁用掉系統的鎖屏,以免造成用戶需要解鎖兩次的局面。

首先我們需要知道用戶是否設置了鎖屏,方法如下:

對于API Level 16及以上SDK,可以使用如下方法判斷是否有鎖:

  1. ((KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE)).isKeyguardSecure() 

對API Level 15及以下SDK,可以使用反射來判斷:

  1. try { 
  2.     Class<?> clazz = Class.forName("com.android.internal.widget.LockPatternUtils"); 
  3.     Constructor<?> constructor = clazz.getConstructor(Context.class); 
  4.     constructor.setAccessible(true); 
  5.     Object utils = constructor.newInstance(this); 
  6.     Method method = clazz.getMethod("isSecure"); 
  7.     return (Boolean) method.invoke(utils); 
  8. }catch (Exception e){ 
  9.     e.printStackTrace(); 
  10.  

好了,得知用戶設置了系統鎖屏,怎么關掉呢?有前人建議了這種方法

  1. KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
  2. KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock(""); 
  3. keyguardLock.disableKeyguard();  

需要權限

  1. <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 

但經筆者測驗,這種方法只能禁用滑動鎖,如果用戶設置的是圖案或者PIN的鎖的話,是無法直接取消的。禁用掉密碼鎖或者圖案鎖是一個很危險的行為,基于此,Google應該是不會把它開放給開發者的,所以現在的鎖屏應用的禁用鎖的辦法,都是直接跳到系統鎖屏設置界面,直接引導用戶去手動關閉。可以通過如下代碼跳到用戶鎖屏設置界面:

  1. Intent in = new Intent(Settings.ACTION_SECURITY_SETTINGS); 
  2. startActivity(in);  

這個也會有些許的兼容性問題,比如,360手機的ROM并沒有把設置系統鎖屏的功能放在安全設置中,所以打開安全設置的界面找不到取消系統鎖屏的地方,這個在一眾鎖屏應用中并沒有做兼容。

三、附加功能中的難點

上面的功能都是直接針對鎖屏本身的實現來說的。鎖屏應用除了本身能夠有“鎖住屏幕”的功能外,還應該有其他一些漂亮又實用的功能,最起碼應該是盡量往系統鎖屏的樣式上靠攏并發揮,才方便被用戶接受。

1.獲取通知

新的Notification到來時應該展示在鎖屏界面上,所以我們需要對通知欄進行監聽。從Android 4.3(api 18)開始,Google給我們提供了一個NotificationListenerService類,第三方應用可以更方便的獲得通知欄使用權(Notification Access),當然,這么敏感的權限得要應用自己聲明,同時還要引導用戶手動授權。如下,建立一個NotificationMonitor類繼承于NotificationListenerService,并聲明權限:

  1. <service android:name=".NotificationMonitor" 
  2.  
  3. android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
  4.  
  5. <intent-filter> 
  6.  
  7. <action android:name="android.service.notification.NotificationListenerService" /> 
  8.  
  9. </intent-filter> 
  10.  
  11. </service>  

然后同引導用戶關閉系統鎖屏一樣,要引導用戶來授權通知欄使用權:

  1. startActivity(new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)); 

可以通過如下代碼檢查到通知欄使用權是否已經拿到:

  1. private boolean isNotificationListenEnabled(){ 
  2.         String pkgName = getPackageName(); 
  3.         final String flat = Settings.Secure.getString(getContentResolver(), 
  4.                 "enabled_notification_listeners"); 
  5.         if (!TextUtils.isEmpty(flat)) { 
  6.             final String[] names = flat.split(":"); 
  7.             for (int i = 0; i < names.length; i++) { 
  8.                 final ComponentName cn = ComponentName.unflattenFromString(names[i]); 
  9.                 if (cn != null) { 
  10.                     if (TextUtils.equals(pkgName, cn.getPackageName())) { 
  11.                         return true
  12.                     } 
  13.                 } 
  14.             } 
  15.         } 
  16.         return false
  17.     }  

拿到通知欄使用權后,系統通知欄的變化就可以在NotificationMonitor里面監聽到了:

  1. public class NotificationMonitor extends NotificationListenerService { 
  2.     @Override 
  3.     public IBinder onBind(Intent intent) { 
  4.         // TODO: Return the communication channel to the service. 
  5.         return null
  6.     } 
  7.  
  8.     @Override 
  9.     public int onStartCommand(Intent intent, int flags, int startId) { 
  10.         return super.onStartCommand(intent,flags,startId); 
  11.     } 
  12.  
  13.     //新的Notification到達 
  14.     @Override 
  15.     public void onNotificationPosted(StatusBarNotification sbn) { 
  16.         super.onNotificationPosted(sbn); 
  17.     } 
  18.  
  19.     //新的Notification到達,api 21新增 
  20.     @Override 
  21.     public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) { 
  22.         super.onNotificationPosted(sbn, rankingMap); 
  23.     } 
  24.  
  25.     //Notification被移除 
  26.     @Override 
  27.     public void onNotificationRemoved(StatusBarNotification sbn) { 
  28.         super.onNotificationRemoved(sbn); 
  29.     } 
  30.  
  31.     //Notification被移除,api 21新增 
  32.     @Override 
  33.     public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) { 
  34.         super.onNotificationRemoved(sbn, rankingMap); 
  35.     } 
  36.  
  37.     //Notification排序變動,api 21新增 
  38.     @Override 
  39.     public void onNotificationRankingUpdate(RankingMap rankingMap) { 
  40.         super.onNotificationRankingUpdate(rankingMap); 
  41.     } 
  42.  
  43.     //Service與系統通知欄完成綁定時回調,綁定后才能收到通知欄回調,api 21新增 
  44.     @Override 
  45.     public void onListenerConnected() { 
  46.         super.onListenerConnected(); 
  47.     } 
  48.  

同時,NotificationListenerService還提供了cancelNotification和cancelAllNotification方法,用于移除通知欄的通知,可以很方便的實現在自定義的鎖屏界面移除掉通知了。

筆者實現這個類的時候發現了一個坑,所有的代碼都是OK的,通知欄使用權也授權了,但是來通知時始終沒有回調onNotificationPosted,查問題查了很久,后來看到網上有人遇到同樣的問題,另外新建了一個類把代碼復制過去,就OK了,這樣看來應該是編譯器的問題。

獲取了通知欄使用權的Service天然就能被保活,如果被殺死,Android系統能夠將它重啟。所以平時看到一些應用要求獲取通知欄使用權時,要注意這類應用會永久駐存后臺的。當然,如果這個Service所在進程崩潰達到一定次數的話,Android系統也會灰心,在下次關機重啟前不會再將Service重啟,所以,開發中最好能將這個Service放在一個輕量獨立的進程中。

2.獲取HotSeat區快捷方式

桌面快捷方式分為兩類,Desktop區,指隨著屏幕滾動的那部分,HotSeat區,指放置于桌面底部不隨屏幕滾動的部分。用戶自定義的HotSeat區里的快捷方式屬于常用的應用。如果能夠在鎖屏界面也添加這部分的快捷啟動,會是一個比較友好的功能。這個的主要問題是,怎么獲取到HotSeat區的快捷方式呢。

系統快捷方式存儲在數據庫文件launcher.db中的favorites表中,如圖所示:

 

 可以看到有對應的快捷方式的id,title和intent,這個container屬性是用來指示所在文件夾的id,然而可以看到有的container為負數。這是為什么,筆者查看了一下Android Launcher相關的源碼,找到這么兩句: 

  1. /** 
  2. * The icon is a resource identified by a package name and an integer id. 
  3. */ 
  4. public static final int CONTAINER_DESKTOP = -100; 
  5. public static final int CONTAINER_HOTSEAT = -101;  

也就是說,container為-100的是Desktop區的快捷方式,container為-101的正是要找的HotSeat區的快捷方式。

現在知道了快捷方式的存儲方式,接下來的問題就是去找launcher.db文件的路徑。

在不同版本的Android原生api中,由于默認使用的launcher啟動器的包名不一樣,launcher.db存儲的路徑也不一樣。

  1. Android API 7及以下:/data/data/com.android.launcher/databases/laucher.db 
  2. Android API 8~18:/data/data/com.android.launcher2/databases/laucher.db 
  3. Android API 19及以上:/data/data/com.android.launcher3/databases/laucher.db  

而對于各式各樣的第三方ROM,使用了千奇百怪的laucher包名,這個路徑就更亂了: 

  1. HTC: /data/data/com.htc.launcher/databases/laucher.db 
  2. 360: /data/data/net.qihoo360.launcher/databases/laucher.db 
  3. 華為: /data/data/com.huawei.launcher3/databases/laucher.db 
  4. 小米: /data/data/com.miui.mihome2/databases/laucher.db 
  5. ... 

當然,我們不會通過直接讀取數據庫的方式來獲取快捷方式的信息,系統自帶的laucher會提供ContentProvider給外部讀取。避開了對數據庫路徑做兼容的大坑,轉眼就掉進了另一個大坑,通過Provider來讀取快捷方式,所需要的權限和URI也需要做兼容。

從快捷方式的存儲可見,Android 的碎片化是多么的嚴重,所以最后筆者決定不再深入去兼容實現,這是得不償失的行為,有興趣實現的可以看看這篇文章,判斷一個快捷方式是否存在是多么的難:http://www.jianshu.com/p/dc3d...

3.獲取壁紙

鎖屏界面的背景和手機桌面壁紙保持一致,不至于讓用戶覺得突兀,這里有兩種辦法實現獲取壁紙。

Activity Style模式

如果是Activity實現的鎖屏界面,可以直接設置Activity的theme就可以用壁紙做背景了。

  1. android:theme="@android:style/Theme.Wallpaper.NoTitleBar" 

WallPaperManager模式

懸浮窗模式的鎖屏界面無法用theme,那么可以通過WallPaperManager來獲取壁紙。

  1. // 獲取壁紙管理器 
  2. WallpaperManager wallpaperManager = WallpaperManager 
  3.                 .getInstance(this); 
  4. // 獲取當前壁紙 
  5. Drawable wallpaperDrawable = wallpaperManager.getDrawable(); 
  6. // 將Drawable,轉成Bitmap 
  7. Bitmap bm = ((BitmapDrawable) wallpaperDrawable).getBitmap(); 
  8. mRootView.setBackgroundDrawable(new BitmapDrawable(bm)); 

這種方式在小米等仿iOS的一屏桌面上是OK的,但是在原生Android那樣的兩屏桌面(快捷方式與全部app分別在不同屏),快捷方式那屏獲取的壁紙是一整張大壁紙,而實際laucher顯示的是切割后的壁紙。所以以上方式會把尺寸不符的壁紙設為了背景。需要自己去根據laucher的屏數和當前是第幾屏來進行切圖,laucher的總屏數可以在上述launcher.db里的workspaceScreens表里找到,而具體當前在第幾屏是存在launcher app內存實例中的,無法獲取。如果真要切的話,建議直接按照屏幕寬高切下整張壁紙的左邊一屏就好了。

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

2016-01-29 10:19:26

2022-10-21 09:01:33

小組件iOS

2014-09-25 09:51:29

Android App個人博客

2022-01-17 09:22:42

SwiftUI App Store開源

2020-07-30 09:35:09

Redis分布式鎖數據庫

2022-04-14 07:56:30

公平鎖Java線程

2021-09-08 15:43:03

在線寫作協作文檔辦公軟件

2024-05-08 10:20:00

Redis分布式

2021-11-01 12:25:56

Redis分布式

2024-07-15 08:25:07

2017-02-24 10:30:51

iOS開源App Store

2013-12-19 13:25:40

InnoDB數據庫

2022-06-16 15:07:06

布局結構app

2014-07-02 10:03:42

App推廣渠道

2009-10-20 14:10:00

CCIE經驗

2022-03-04 14:17:08

JS工具庫錄音

2014-10-14 15:50:19

UIAndroid

2012-12-24 13:25:59

微信App

2020-01-06 09:53:29

程序員

2020-12-21 16:35:51

JavaScript網頁截屏代碼
點贊
收藏

51CTO技術棧公眾號

性欧美18—19sex性高清| 亚洲精品在线视频观看| 国产成人啪精品午夜在线观看| 五月婷婷亚洲综合| 国产77777| 久久精品盗摄| 精品国模在线视频| 污片免费在线观看| 日韩毛片一区| 亚洲成人激情综合网| 日韩精品最新在线观看| 性中国古装videossex| 午夜综合激情| 久久99精品视频一区97| 日韩中文字幕电影| 欧美区一区二区| 色欧美日韩亚洲| 黄色激情在线视频| 日本免费中文字幕在线| 不卡一区中文字幕| 成人午夜高潮视频| 午夜精品一区二| 亚洲网站在线| 久久亚洲精品成人| 国产成人av一区二区三区不卡| 国产精一区二区| 欧美亚洲国产一区二区三区 | 日韩av不卡在线| 日韩影院一区二区| 日韩欧美午夜| 亚洲色图15p| 2一3sex性hd| 久久伦理中文字幕| 欧美日韩久久久一区| av观看免费在线| a级片在线免费观看| 亚洲免费观看高清完整版在线观看| 青青影院一区二区三区四区| 女人18毛片一区二区三区| 国内精品第一页| 国产欧美韩国高清| 中文字幕无码乱码人妻日韩精品| 午夜在线精品偷拍| 奇米成人av国产一区二区三区| 国产在线观看成人| 很黄很黄激情成人| 九九久久久久99精品| 日韩av毛片在线观看| 成人午夜国产| 伊人久久大香线蕉av一区二区| 国产美女免费无遮挡| 免费欧美视频| 亚洲美女久久久| 少妇饥渴放荡91麻豆| 狠狠一区二区三区| 亚洲精品国产福利| 欧美成人午夜精品免费| 亚洲欧洲免费| 亚洲视频欧洲视频| 久久免费手机视频| 97人人精品| 欧美日韩成人在线观看| 久久这里只有精品免费| 一本色道久久综合一区| 欧美亚洲国产视频小说| 色老头在线视频| 蜜臀av亚洲一区中文字幕| 国产精品中文字幕在线| 一级爱爱免费视频| 国产乱人伦偷精品视频免下载| 91精品久久久久久蜜桃| 精品国产黄色片| 成av人片一区二区| 青娱乐一区二区| 麻豆影院在线观看| 亚洲亚洲精品在线观看| 鲁一鲁一鲁一鲁一澡| 香蕉久久免费电影| 欧美日本韩国一区| 久久国产免费视频| 嫩草一区二区三区| 精品国模在线视频| 天天插天天操天天干| 日韩中文字幕区一区有砖一区| 国产欧美精品在线| 亚洲黄色在线播放| 久久久不卡网国产精品一区| 一区二区在线高清视频| 欧美aaaaaaa| 色综合久久88色综合天天6| 艹b视频在线观看| 欧洲大片精品免费永久看nba| 亚洲精品按摩视频| 91禁男男在线观看| 最新国产乱人伦偷精品免费网站| 国产成人一区二区三区| 国产成人三级一区二区在线观看一 | 97婷婷涩涩精品一区| 潘金莲一级淫片aaaaaa播放| 激情综合网最新| 久久久精品动漫| 黄色网页在线观看| 欧美三级xxx| 日本r级电影在线观看| 亚洲激情播播| 欧美肥老妇视频| 波多野结衣午夜| 成人国产精品免费网站| 亚洲精品二区| 色在线中文字幕| 日韩一区二区三区四区五区六区| 国产福利短视频| 欧美激情1区2区3区| 国产成人精品久久二区二区91| www.中文字幕| 国产精品二三区| 国产一区亚洲二区三区| 草莓视频一区二区三区| 久久精品国产亚洲7777| 无码人妻丰满熟妇区bbbbxxxx| 丰满岳乱妇一区二区三区| 亚洲一区二区精品在线观看| 麻豆视频在线看| 精品日产卡一卡二卡麻豆| 91视频青青草| 日本亚洲免费观看| 欧美另类一区| 涩涩视频在线免费看| 精品精品国产高清a毛片牛牛 | 亚洲成人777| 国产精品91av| 亚洲午夜精品一区 二区 三区| 国产精品成人v| 手机看片1024日韩| 亚洲成国产人片在线观看| 51自拍视频在线观看| 久久精品国产大片免费观看| 国产精品99久久久久久久久| 欧美日韩国产中文字幕在线| 偷拍一区二区三区| 免费a v网站| 中文在线不卡| 久久精品日韩精品| 亚洲女同志freevdieo| 亚洲国产另类久久精品| 国产性70yerg老太| 成人听书哪个软件好| 免费一级淫片aaa片毛片a级| 成人动态视频| 国外成人性视频| 四虎永久在线观看| 富二代精品短视频| 中国毛片在线观看| 日本亚洲免费观看| 中文字幕欧美人与畜| 四虎精品一区二区免费| 久久亚洲一区二区三区四区五区高 | 成人黄视频免费| 国产羞羞视频在线播放| 精品88久久久久88久久久| 久草视频精品在线| 97精品电影院| 日韩精品免费播放| 色无极亚洲影院| 亚洲精品日产aⅴ| 男女视频在线| 精品中文字幕久久久久久| 日本a级c片免费看三区| 国产精品美女久久久久久久久| 国产精品自拍视频在线| 亚洲成人最新网站| 国产高清自拍一区| 黑人巨大亚洲一区二区久 | 免费中文字幕在线| 国产成人免费网站| 少妇人妻在线视频| 欧美色女视频| av成人观看| 超级碰碰久久| www国产亚洲精品久久网站| 亚洲成熟女性毛茸茸| 欧美三级欧美成人高清www| 大胸美女被爆操| 国产.精品.日韩.另类.中文.在线.播放| 亚洲人成无码网站久久99热国产| 要久久爱电视剧全集完整观看 | 91高潮大合集爽到抽搐| 一区二区在线免费观看| 亚洲精品视频久久久| 激情欧美一区二区| 人人妻人人添人人爽欧美一区| 第一会所sis001亚洲| 国产精品免费一区二区三区在线观看| 超碰aⅴ人人做人人爽欧美| 久久天天躁夜夜躁狠狠躁2022| 性感美女一级片| 6080亚洲精品一区二区| 美日韩一二三区| 国产精品电影一区二区三区| 尤物网站在线观看| 久草中文综合在线| 日本免费一级视频| 欧美韩日精品| 亚洲国产成人不卡| 欧美福利在线播放网址导航| 国产欧美日韩中文字幕| 国内激情视频在线观看| 久久亚洲一区二区三区四区五区高| 嫩草研究院在线| 日韩欧美国产一区在线观看| 中文字幕久久网| 午夜不卡在线视频| 精品97人妻无码中文永久在线| 国产免费久久精品| 精品一区二区视频在线观看| 国产在线播放一区二区三区| 91视频免费版污| 国产精品久久久免费| 免费的一级黄色片| 91精品国产91久久久久久密臀| 麻豆蜜桃91| 国产精品久久久久av蜜臀| 91手机视频在线观看| 97欧美成人| 日本成人黄色片| 三级在线看中文字幕完整版| 久久久久久久色| 成人短视频在线| 日韩有码片在线观看| 成人精品一区二区三区免费| 日韩精品中文字幕在线播放| 狠狠躁日日躁夜夜躁av| 日韩欧美国产小视频| 国产美女免费视频| 欧美猛男gaygay网站| 中文字幕激情视频| 欧美网站一区二区| 青娱乐在线免费视频| 日本电影亚洲天堂一区| 激情网站在线观看| 在线观看欧美精品| 亚洲成人av网址| 精品视频色一区| 在线观看中文字幕码| 欧美日韩一区二区电影| 中文字幕 亚洲视频| 欧美性生活大片视频| 国产美女www爽爽爽| 欧美性猛交一区二区三区精品| 99久久久无码国产精品免费蜜柚 | 性欧美在线看片a免费观看| 搞黄网站在线看| 国内精品久久久久伊人av | 国产精品色视频| 国产69精品久久久久9999人| 国产精品日韩电影| 伊人国产精品| 成人9ⅰ免费影视网站| 老汉色老汉首页av亚洲| 免费电影一区| 欧美一站二站| 91xxx视频| 亚洲午夜极品| 国产超级av在线| 日韩av一区二区三区四区| www.com黄色片| 国产一区二区成人久久免费影院| 蜜桃视频无码区在线观看| 不卡一区二区三区四区| 中文字幕人妻一区二区| 国产精品热久久久久夜色精品三区| 国产三级aaa| 夜夜精品视频一区二区| www.国产色| 欧美美女直播网站| 婷婷在线免费视频| 国产亚洲一区二区在线| av网站在线免费| 26uuu亚洲国产精品| 成人国产一区二区三区精品麻豆| 亚洲aⅴ日韩av电影在线观看| 嗯用力啊快一点好舒服小柔久久| 蜜桃av色综合| 亚欧美无遮挡hd高清在线视频 | 日本一不卡视频| √天堂资源在线| 成人免费视频app| 免费看污片的网站| 一区二区三区在线免费观看| 91玉足脚交嫩脚丫在线播放| 欧美精品在线观看播放| 天堂a√中文在线| 久久精品99久久久久久久久| 爱搞国产精品| 91在线高清免费观看| 一区二区小说| 国产免费内射又粗又爽密桃视频| 性一交一乱一区二区洋洋av| 色91精品久久久久久久久| 99久久久免费精品国产一区二区| 波多野结衣欲乱| 欧美性xxxx在线播放| 精品国产亚洲av麻豆| 伊人久久精品视频| 日韩脚交footjobhd| 3d动漫啪啪精品一区二区免费| 精品国产乱码久久久久久果冻传媒| 超级碰在线观看| 蜜臀国产一区二区三区在线播放| 成人免费毛片日本片视频| 亚洲伦在线观看| 在线免费观看视频网站| 亚洲欧美色婷婷| av免费不卡国产观看| 91免费看片在线| 日韩a一区二区| 日本男人操女人| 91视频在线观看免费| 青娱乐免费在线视频| 欧美理论片在线| 国产剧情在线观看| 欧美最猛性xxxxx免费| av综合网址| 亚洲乱码日产精品bd在线观看| 久久99久久99小草精品免视看| av电影网站在线观看| 欧美丝袜第一区| 四虎影视在线播放| 午夜精品久久久久久久男人的天堂| 久久久久久亚洲精品美女| 在线综合视频网站| 精品一区二区在线视频| 日本一二三不卡视频| 在线国产电影不卡| 韩国三级在线观看久| 青青久久av北条麻妃海外网| 亚洲激情播播| 成人在线激情网| 久久久美女艺术照精彩视频福利播放| 日韩视频在线观看一区| 日韩成人av网址| 亚洲免费福利| 欧美日韩综合精品| 久久亚洲美女| 国产精品美女高潮无套| 欧美又粗又大又爽| 成年在线电影| 国产一区深夜福利| 2023国产精品久久久精品双| 91性高潮久久久久久久| 亚洲一区二区三区四区在线免费观看 | 国产色婷婷在线| 国产九色精品| 香蕉久久夜色精品| 最近中文字幕免费视频| 在线观看www91| 免费a级在线播放| 亚洲专区中文字幕| 禁久久精品乱码| 91视频啊啊啊| 欧美最猛黑人xxxxx猛交| av在线女优影院| 5566av亚洲| 夜夜嗨网站十八久久 | 亚洲精品视频观看| 成人午夜免费福利| 欧美在线精品免播放器视频| 精品国产乱码久久久久久蜜坠欲下| 日韩成人精品视频在线观看| 一区二区三区欧美| 天天在线女人的天堂视频| 国产精品6699| 亚洲成人日韩| av网站有哪些| 69堂成人精品免费视频| 2020日本在线视频中文字幕| 欧美性bbwbbwbbwhd| 韩国三级电影一区二区| 国产精品18p| 国产午夜精品全部视频在线播放 | 久久一区二区精品| 奇米一区二区三区| 国产性生活网站| 国产亚洲aⅴaaaaaa毛片| 视频精品二区| 免费高清在线观看免费| 亚洲欧洲日产国产综合网| 色婷婷av一区二区三| 国产精品精品久久久久久| 在线中文一区| 在线观看日本中文字幕| 日韩午夜电影av| 成人日韩精品| av无码久久久久久不卡网站| 欧美激情在线观看视频免费| 国产福利小视频| 国产精品视频大全| 亚洲每日更新| 黄色录像二级片| 亚洲网站在线播放|