韩国三级高清手机在线版-韩国三级电影久久-韩国三级hd中文字幕一男多女-韩国三级hd中文字幕久久精品-日本精品在线视频-日本精品在线观看视频

一直在仿微信界面,今天終于有幸利用百度云推送仿一仿微信聊天了~~~

首先特別感謝:weidi1989分享的Android之基于百度云推送IM ,大家可以直接下載;省了很多事哈,本例中也使用了weidi的部分代碼,凡是@author way的就是weidi1989的代碼~~

1、效果圖

核心功能也就上面的兩張圖了~~~我拿著手機(jī)和模擬器聊天,同時(shí)感謝群里的兄弟姐妹幫忙測(cè)試(好友列表中)。

2、原理

下面通過(guò)幾個(gè)問(wèn)題來(lái)說(shuō)明下實(shí)現(xiàn)的原理:

1、如何實(shí)現(xiàn)給某個(gè)用戶(hù)發(fā)送消息呢?

其實(shí)就是利用百度云提供的REST API,直接通過(guò)發(fā)送Http請(qǐng)求的形式給某個(gè)用戶(hù)推送一條消息;

網(wǎng)址:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list

實(shí)例:

push_msg
功能
推送消息,該接口可用于推送單個(gè)人、一群人、所有人以及固定設(shè)備的使用場(chǎng)景。
HTTP請(qǐng)求方式
POST
URL
http[s]://channel.api.duapp.com/rest/2.0/channel/channel

....

2、的確可以實(shí)現(xiàn)給某個(gè)用戶(hù)或者一群用戶(hù)推送消息,那么用戶(hù)的昵稱(chēng)神馬的咋獲取的呢,我印象中百度云中沒(méi)法存這樣的數(shù)據(jù)?

嗯,其實(shí)用了一個(gè)比較巧妙的方式;在用戶(hù)首次安裝軟件的時(shí)候,會(huì)要求用戶(hù)填寫(xiě)注冊(cè)信息,也就是昵稱(chēng)等;當(dāng)用戶(hù)填寫(xiě)完畢時(shí),點(diǎn)擊登錄的時(shí)候:

1、發(fā)送一條比較特殊的消息,比如這個(gè)消息攜帶一個(gè)hello的字段,廣播給所有用戶(hù);

2、其他用戶(hù)在收到消息時(shí),首先判斷hello這個(gè)字段是否有值,有值則說(shuō)明新用戶(hù)加入,把該新用戶(hù)存入本地?cái)?shù)據(jù)庫(kù),然后更新用戶(hù)列表;

3、其他用戶(hù)給這個(gè)新用戶(hù)回一條消息,附帶一個(gè)特殊字段,比如welcome,當(dāng)新用戶(hù)收到攜帶welcome字段的消息時(shí),表明這是對(duì)新用戶(hù)hello的答復(fù),然后將已存在用戶(hù)添加到該新用戶(hù)的用戶(hù)列表。

基本原理就這樣了,大家甚至可以利用上述的原理添加一些刪除好友的功能;比如當(dāng)用戶(hù)點(diǎn)擊刪除好友,則發(fā)送一條特殊消息給被刪除的對(duì)象,然后對(duì)方收到該消息,也將發(fā)送發(fā)刪除。

相信大家在了解原理之后,這個(gè)例子瞬間從高大尚變成矮矬窮了,這尼瑪,so easy,誰(shuí)不會(huì)啊~~~

 

3、核心代碼解析

由于代碼量還是相當(dāng)大的,也不想拆成幾篇博客,所以準(zhǔn)備將核心代碼進(jìn)行講解下,其他的大家自己看源碼~

關(guān)于這個(gè)例子的主界面,可以參考: 高仿微信5.2.1主界面架構(gòu) 包含消息通知

關(guān)于百度云推送的入門(mén),可以參考:Android推送 百度云推送 入門(mén)篇

好了,最主要就是收到百度云推送的Receiver

1、onBind

首先是用戶(hù)第一次登錄時(shí)候綁定的回調(diào)

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

  1. @Override  

  2.     public void onBind(final Context context, int errorCode, String appid,  

  3.             String userId, String channelId, String requestId)  

  4.     {  

  5.         String responseString = "onBind errorCode=" + errorCode + " appid="  

  6.                 + appid + " userId=" + userId + " channelId=" + channelId  

  7.                 + " requestId=" + requestId;  

  8.         Log.e(TAG, responseString);  

  9.   

  10.         if (errorCode == 0)  

  11.         {  

  12.             SharePreferenceUtil util = PushApplication.getInstance()  

  13.                     .getSpUtil();  

  14.             util.setAppId(appid);  

  15.             util.setChannelId(channelId);  

  16.             util.setUserId(userId);  

  17.               

  18.         } else  

  19.         // 如果網(wǎng)絡(luò)正常,則重試  

  20.         {  

  21.             if (NetUtil.isNetConnected(context))  

  22.             {  

  23.   

  24.                 T.showLong(context, "啟動(dòng)失敗,正在重試...");  

  25.                 new Handler().postDelayed(new Runnable()  

  26.                 {  

  27.                     @Override  

  28.                     public void run()  

  29.                     {  

  30.                         PushManager.startWork(context,  

  31.                                 PushConstants.LOGIN_TYPE_API_KEY,  

  32.                                 PushApplication.API_KEY);  

  33.                     }  

  34.                 }, 2000);// 兩秒后重新開(kāi)始驗(yàn)證  

  35.             } else  

  36.             {  

  37.                 T.showLong(context, R.string.net_error_tip);  

  38.             }  

  39.         }  

  40.         // 回調(diào)函數(shù)  

  41.         for (int i = 0; i < bindListeners.size(); i++)  

  42.             bindListeners.get(i).onBind(userId, errorCode);  

  43.     }  

初次綁定的時(shí)候,如果綁定成功則使用SharedPreferences存儲(chǔ)userId,channelId等數(shù)據(jù)

然后回調(diào):bindListeners.get(i).onBind(userId, errorCode);給所有注冊(cè)該事件的發(fā)出通知

下面看listener.onBind

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

  1. /**

  2.      * 收到通知

  3.      */  

  4.     @Override  

  5.     public void onBind(String userId, int errorCode)  

  6.     {  

  7.         Log.e("TAG""Login Activity onBind ");  

  8.         if (errorCode == 0)  

  9.         {  

  10.             Log.e("TAG""Login Activity onBind success ");  

  11.             // 如果綁定賬號(hào)成功,由于第一次運(yùn)行,給同一tag的人推送一條新人消息  

  12.             User u = new User(mSpUtil.getUserId(), mSpUtil.getChannelId(),  

  13.                     mSpUtil.getNick(), mSpUtil.getHeadIcon(), 0);  

  14.             mUserDB.addUser(u);// 把自己添加到數(shù)據(jù)庫(kù)  

  15.             Message firstSendMsg = new Message(System.currentTimeMillis(), "");  

  16.             firstSendMsg.setHello("hello");  

  17.             task = new SendMsgAsyncTask(mGson.toJson(firstSendMsg), "");  

  18.             task.setOnSendScuessListener(new OnSendScuessListener()  

  19.             {  

  20.                 @Override  

  21.                 public void sendScuess()  

  22.                 {  

  23.                     if (mLoadingDialog != null && mLoadingDialog.isVisible())  

  24.                         mLoadingDialog.dismiss();  

  25.                     mHandler.removeCallbacks(mConnTimeoutCallback);  

  26.                     finish();  

  27.                     Intent intent = new Intent(LoginActivity.this,  

  28.                             MainActivity.class);  

  29.                     startActivity(intent);  

  30.                 }  

  31.             });  

  32.             task.send();  

  33.         }  

  34.     }  

首先將自己保存到本地?cái)?shù)據(jù)庫(kù),然后發(fā)送一個(gè)Message給所有的用戶(hù),設(shè)置一個(gè)特殊字段hello;也就是上述的原理分析中的部分~

 

2、onMessage

收到百度云推送的Receiver中的onMessage

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

  1. @Override  

  2.     public void onMessage(Context context, String message,  

  3.             String customContentString)  

  4.     {  

  5.         String messageString = "收到消息 message=\"" + message  

  6.                 + "\" customContentString=" + customContentString;  

  7.         Log.e(TAG, messageString);  

  8.         Message receivedMsg = PushApplication.getInstance().getGson()  

  9.                 .fromJson(message, Message.class);  

  10.         // 對(duì)接收到的消息進(jìn)行處理  

  11.         parseMessage(receivedMsg);  

  12.   

  13.     }  

  14.   

  15.     /**

  16.      * 消息:1、攜帶hello,表示新人加入,應(yīng)該自動(dòng)回復(fù)一個(gè)world 消息; 2、普通消息;

  17.      * 

  18.      * @param msg

  19.      */  

  20.     private void parseMessage(Message msg)  

  21.     {  

  22.         String userId = msg.getUserId();  

  23.         // 自己的消息  

  24.         if (userId  

  25.                 .equals(PushApplication.getInstance().getSpUtil().getUserId()))  

  26.             return;  

  27.         if (checkHasNewFriend(msg) || checkAutoResponse(msg))  

  28.             return;  

  29.         // 普通消息  

  30.         UserDB userDB = PushApplication.getInstance().getUserDB();  

  31.         User user = userDB.selectInfo(userId);  

  32.         // 漏網(wǎng)之魚(yú)  

  33.         if (user == null)  

  34.         {  

  35.             user = new User(userId, msg.getChannelId(), msg.getNickname(), 00);  

  36.             userDB.addUser(user);  

  37.             // 通知監(jiān)聽(tīng)的面板  

  38.             for (onNewFriendListener listener : friendListeners)  

  39.                 listener.onNewFriend(user);  

  40.         }  

  41.         if (msgListeners.size() > 0)  

  42.         {// 有監(jiān)聽(tīng)的時(shí)候,傳遞下去  

  43.             for (int i = 0; i < msgListeners.size(); i++)  

  44.                 msgListeners.get(i).onNewMessage(msg);  

  45.         } else  

  46.         // 當(dāng)前沒(méi)有任何監(jiān)聽(tīng),即處理后臺(tái)狀態(tài)  

  47.         {  

  48.             // 將新來(lái)的消息進(jìn)行存儲(chǔ)  

  49.             ChatMessage chatMessage = new ChatMessage(msg.getMessage(), true,  

  50.                     userId, msg.getHeadIcon(), msg.getNickname(), false,  

  51.                     TimeUtil.getTime(msg.getTimeSamp()));  

  52.             PushApplication.getInstance().getMessageDB()  

  53.                     .add(userId, chatMessage);  

  54.             showNotify(msg);  

  55.         }  

  56.     }  

  57.   

  58.     /**

  59.      * 檢測(cè)是否是自動(dòng)回復(fù)

  60.      * 

  61.      * @param msg

  62.      */  

  63.     private boolean checkAutoResponse(Message msg)  

  64.     {  

  65.         String world = msg.getWorld();  

  66.         String userId = msg.getUserId();  

  67.         if (!TextUtils.isEmpty(world))  

  68.         {  

  69.             User u = new User(userId, msg.getChannelId(), msg.getNickname(),  

  70.                     msg.getHeadIcon(), 0);  

  71.             PushApplication.getInstance().getUserDB().addUser(u);// 存入或更新好友  

  72.             // 通知監(jiān)聽(tīng)的面板  

  73.             for (onNewFriendListener listener : friendListeners)  

  74.                 listener.onNewFriend(u);  

  75.   

  76.             return true;  

  77.         }  

  78.         return false;  

  79.     }  

  80.   

  81.     /**

  82.      * 檢測(cè)是否是新人加入

  83.      * 

  84.      * @param msg

  85.      */  

  86.     private boolean checkHasNewFriend(Message msg)  

  87.     {  

  88.         String userId = msg.getUserId();  

  89.         String hello = msg.getHello();  

  90.         // 新人發(fā)送的消息  

  91.         if (!TextUtils.isEmpty(hello))  

  92.         {  

  93.             Log.e("checkHasNewFriend", msg.getUserId());  

  94.             // 新人  

  95.             User u = new User(userId, msg.getChannelId(), msg.getNickname(),  

  96.                     msg.getHeadIcon(), 0);  

  97.             PushApplication.getInstance().getUserDB().addUser(u);// 存入或更新好友  

  98.             T.showShort(PushApplication.getInstance(), u.getNick() + "加入");  

  99.   

  100.             // 給新人回復(fù)一個(gè)應(yīng)答  

  101.             Message message = new Message(System.currentTimeMillis(), "");  

  102.             message.setWorld("world");  

  103.             new SendMsgAsyncTask(PushApplication.getInstance().getGson()  

  104.                     .toJson(message), userId);  

  105.             // 通知監(jiān)聽(tīng)的面板  

  106.             for (onNewFriendListener listener : friendListeners)  

  107.                 listener.onNewFriend(u);  

  108.   

  109.             return true;  

  110.         }  

  111.   

  112.         return false;  

  113.     }  


當(dāng)收到一個(gè)新的消息:

1、首先判斷是不是自己發(fā)的,是,忽略;

2、判斷是否攜帶hello字段,代表新人加入,攜帶,則保存到好友列表,且回復(fù)一個(gè)攜帶welcome字段的消息;

3、判斷是否包含welcome字段,包含,存入好友列表

4、不是1、2、3則肯定是普通消息,將消息保存到本地?cái)?shù)據(jù)庫(kù),然后為所有設(shè)置消息監(jiān)聽(tīng)的發(fā)送回調(diào)即可~

 

MainTabFriends.java用戶(hù)列表中收到新消息的回調(diào):

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

  1. /**

  2.      * 收到新消息時(shí)

  3.      */  

  4.     @Override  

  5.     public void onNewMessage(Message message)  

  6.     {  

  7.         // 如果是自己發(fā)送的,則直接返回  

  8.         if (message.getUserId() == mSpUtils.getUserId())  

  9.             return;  

  10.         // 如果該用戶(hù)已經(jīng)有未讀消息,更新未讀消息的個(gè)數(shù),并通知更新未讀消息接口,最后notifyDataSetChanged  

  11.         String userId = message.getUserId();  

  12.         if (mUserMessages.containsKey(userId))  

  13.         {  

  14.             mUserMessages.put(userId, mUserMessages.get(userId) + 1);  

  15.         } else  

  16.         {  

  17.             mUserMessages.put(userId, 1);  

  18.         }  

  19.         mUnReadedMsgs++;  

  20.         notifyUnReadedMsg();  

  21.         // 將新來(lái)的消息進(jìn)行存儲(chǔ)  

  22.         ChatMessage chatMessage = new ChatMessage(message.getMessage(), true,  

  23.                 userId, message.getHeadIcon(), message.getNickname(), false,  

  24.                 TimeUtil.getTime(message.getTimeSamp()));  

  25.         mApplication.getMessageDB().add(userId, chatMessage);  

  26.         // 通知listview數(shù)據(jù)改變  

  27.         mAdapter.notifyDataSetChanged();  

  28.     }  


1、如果是自己發(fā)的不做任何處理

2、如果當(dāng)前消息發(fā)送用戶(hù)已有未讀消息,則更新該用戶(hù)未讀消息個(gè)數(shù)(用戶(hù)Item上顯示未讀消息通知數(shù)),更新所有未讀消息總和(朋友Tab上顯示未讀消息總和),然后存儲(chǔ)該消息

3、刷新界面

 

ChattingActivity.java聊天界面的新消息回調(diào)

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

  1. @Override  

  2.     public void onNewMessage(Message message)  

  3.     {  

  4.   

  5.         // 獲得回復(fù)的消息  

  6.         if (mFromUser.getUserId().equals(message.getUserId()))  

  7.         {  

  8.             ChatMessage chatMessage = new ChatMessage();  

  9.             chatMessage.setComing(true);  

  10.             chatMessage.setDate(new Date(message.getTimeSamp()));  

  11.             chatMessage.setMessage(message.getMessage());  

  12.             chatMessage.setUserId(message.getUserId());  

  13.             chatMessage.setNickname(message.getNickname());  

  14.             chatMessage.setReaded(true);  

  15.             mDatas.add(chatMessage);  

  16.             mAdapter.notifyDataSetChanged();  

  17.             mChatMessagesListView.setSelection(mDatas.size() - 1);  

  18.             // 存入數(shù)據(jù)庫(kù),當(dāng)前聊天記錄  

  19.             mApplication.getMessageDB().add(mFromUser.getUserId(), chatMessage);  

  20.         }  

  21.     }  


首先判斷是否是正在聊天的用戶(hù)發(fā)的消息,如果是,直接存入數(shù)據(jù)庫(kù),刷新聊天界面;

 

 

穩(wěn)定

產(chǎn)品高可用性高并發(fā)

貼心

項(xiàng)目群及時(shí)溝通

專(zhuān)業(yè)

產(chǎn)品經(jīng)理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽(yù)

堅(jiān)持

10年專(zhuān)注高端品質(zhì)開(kāi)發(fā)
  • 返回頂部
国内少妇人妻丰满AV| 日产精品卡2卡三卡乱码网址| 成为人视频人的APP有哪些软件| 野花香高清视频在线观看免费| 无码中文字幕日韩专区| 日本熟妇色XXXXX日本老妇| 男女一起差差差差差| 久久久久精品电影一区二区三区| 国产熟女露脸大叫高潮| 国产 | 欧洲野花视频欧洲1| 啊轻点灬大巴太粗太长视频| 18无码粉嫩小泬无套在线观看| 亚洲无人区一码二码三码区别大吗| 性色AV浪潮AV色欲AV| 熟女无套高潮内谢吼叫免费| 日本精品VIDEOSSEX 黑| 强开小娟嫩苞又嫩又紧| 内射人妻视频国内| 麻花传媒MD0076沈芯语在线| 久久精品麻豆日日躁夜夜躁| 精产国品一二三产品区别大吗| 国产喷水1区2区3区咪咪爱AV| 国产成人久久777777| 俄罗斯人和欧洲人的性格差异| 边做边爱MP3在线播放免费观看| AV无码精品一区二区三区| 中文字幕乱码一区二区免费| 一杆长枪直入两扇门| 亚洲熟女综合色一区二区三区| 亚洲精品无码正在夜夜骚| 亚洲成a人片8888一在线观看| 亚洲AV片毛片成人观看| 亚洲AⅤ优女AV综合久久久| 性色AV一区二区三区| 无码熟妇人妻AⅤ在线电影| 午夜精品一区二区三区在线视| 无码少妇一区二区三区浪潮AV| 天堂99久久久久久久久久久| 天美传媒MV免费观看| 污污免费看锕锕锕锕锕锕| 忘忧草日本社区WWW在线| 午夜精品久久久久久99热| 性欧美18-19SEX性高清播| 亚洲AV毛茸茸av成熟女人| 亚洲AV乱码久久精品蜜桃| 亚洲国产精品成人久久久| 亚洲精品国产精品乱码视色| 亚洲日韩激情无码一区| 一区二区操逼视频| 69国产成人综合久久精品| GOGO人体大胆高清啪啪| 成人亚洲AV网站在线看AAAA| 公和熄洗澡三级在线观看| 国产成人无码AV一区二区 | 青春草无码精品视频在线观看| 欧美一级137片内射亚洲| 人妻被按摩到潮喷中文字幕| 日本免费不卡在线观看的NV| 三上悠亚SSNI452内衣模特| 熟妇的滚烫的肉唇翻进翻出| 无码人妻斩一区二区三区| 亚洲AV永久无码精品无码网站| 亚洲色老汉AV无码专区最| 做I爱直播APP| 成AV人电影在线观看| 国产精品美女WWW爽爽爽视频 | 群体交乱之放荡娇妻| 日木AV无码专区亚洲AV毛片| 无码人妻精品一区二区| 亚洲国产欧美在线观看片不卡| 一边亲着一面膜下奶韩剧| BGMBGMBGM老太太水太多| 儿子比老公更大更硬朗| 国内精品久久影院综合日日| 久久久久久妓女精品影院| 欧美内射深喉中文字幕| 射精专区一区二区朝鲜| 亚洲AV中文无码乱人伦下载| 永久939W79W99W乳液| 爆乳熟妇一区二区三区霸乳| 国产精品久久久久久久久鸭 | √天堂中文WWW官网在线| CHINA末成年VIDEO学生| 国产成人亚洲精品另类动态| 精品国产A∨无码一区二区三区| 猛猛操逼xxxxx| 色窝窝人妻9色聚色窝| 亚洲AV永久无码精品一福利| 18禁美女裸体网站无遮挡| 东北妓女激情普通话对白| 娇小VIDEOS出血| 欧美高跟丝袜人妻精品无乱码| 天堂中文在线最新版地址| 亚洲一区制服无码中字| А√天堂中文在线| 国产做国产爱免费视频| 男生J桶进女人P又色又爽又黄 | 亚洲中文字幕日产无码| YYYY1111111午夜少妇| 国内精品久久久久影院一蜜桃 | 午夜福利国产成人A∨在线观看| 一本无码人妻在中文字幕免费 | 妺妺坐在我腿上勃起弄了视频| 日韩人妻无码中文字幕视频| 亚洲精品国产A久久久久久| www.内射孕妇网站入口| 国产午夜无码片在线观看影院| 免费无码又爽又刺激激情视频软件| 舌尖伸入湿嫩蜜汁呻吟| 一本大道无码日韩精品影视_| 东北一家人1一6全文阅读小说| 久久97久久97精品免视看 | 中国老太卖婬HD播放| 国产成人高清精品免费软件 | 成人爽A毛片免费网站| 精品日本一区二区三区免费| 人妻少妇乱子伦无码视频专区| 亚洲AV综合A∨一区二区| CHINESE玩弄老年熟女| 黑料传送门TTTZZZ07DU| 人与畜禽共性关系的重要性有哪些| 亚洲国产成人AV网站| 超碰97人人模人人爽人人喊| 久久99国产乱子伦精品免费| 日韩A人毛片精品无人区乱码| 亚洲熟妇无码V在线观看| 高潮VIDEOSSEX潮喷另类| 老妇做爰XXXⅩ性视频| 调教秘书跪趴撅起来打光屁股作文| 在线精品国产一区二区三区| 国产乱人伦偷精品视频免观看| 欧美人伦禁忌DVD放荡欲情| 亚洲精华液一二三产区| 丰满性熟妇ⅩXXOOOSEX| 免费少妇A级毛片| 亚洲AV无码乱码在线观看裸奔 | 午马视频影院1区2区3区4区| 97人妻成人免费视频| 精品久久久无码人妻字幂| 熟妇无码乱子成人精品| 97久久精品午夜一区二区| 精品国产一区二区亚洲人成毛片| 骚片AV蜜桃精品一区| ◇一本大道香蕉中文在线| 精品人妻无码一区二区色欲AⅤ| 熟女无套高潮内谢吼叫免费| 99久久免费国产精品四虎99久久精品免费看国产一区二区 | 性色AV免费观看| 成人伊人亚洲人综合网站| 老太婆BBW搡BBBB搡搡搡搡| 亚洲AV成人无码久久精品老人| 成人艳情一二三区| 欧美无人区码卡二卡3卡2022| 亚洲色欲色欲WWW在线看小说| 国产成人无码精品一区在线观看 | 人妻色欲AV无码专区精油按摩| 一本色道久久综合亚州精品蜜桃| 国产探花在线精品一区二区| 色老板在线永久免费视频| 939W78V78W乳液永久W| 久久水蜜桃网国产欧美H版护士| 亚洲AV无码AV吞精久久| 给老子叫 老子喜欢听| 欧美一区二区三区啪啪| 中文字幕精品亚洲人成在线| 精品无码专区免费下载| 亚洲AⅤ无码成人网站国产APP| 公交车上售票员用B验票小镇| 欧美日韩国产精品自在自线| 永久免费AV无码不卡在线观看| 禁18在线观看免费网站| 小嫩妇里面又嫩又紧| 国产成人AAAAA级毛片| 日韩免费无码视频一区二区三区 | 内射丰满熟妇18p一区二区| 一二三四电影在线观看视频播放免| 黑人av巨大粗吊| 亚洲ⅤA中文字幕无码| 国产激情大臿免费视频| 色欲AV自慰一区二区三区| 扒开双腿疯狂进出爽爽爽动态图| 农民人伦一区二区三区| 中文字幕欧美人妻精品一区| 久久人妻蜜桃一区二区三区| 亚洲色大成网站WWW永久网站 | 久久久精品人妻人人澡| 亚洲AV永久纯肉无码精品wwt| 国产内射合集颜射| 性 偷窥 间谍 tube| 国产成人人综合亚洲欧美丁香花| 少妇爆乳无码AV无码专区| 成人免费一区二区三区视频软件 | 亚洲成A人片在线不卡一二三区| 国产亚洲精品无码成人| 香蕉直播永久免费版APP| 国产深夜男女无套内射| 亚洲AV色香蕉一区二区三区蜜桃 | 九九九九精品视频在线观看| 亚洲国产天堂久久综合网| 精品久久久BBBB人妻|