av一区二区三区在线观看_久久久久国产一区二区三区_伊人春色在线播放_欧美亚洲国产一区_九九热在线免费视频_久久视频国产

1、單聊

? 發送文本\圖片\附件—我們假設Tony給John發送文本消息,則代碼如下:(參考Demo中IMChattingHelper類和ChattingFragment類)

try {
    // 組建一個待發送的ECMessage
    ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
   //如果需要跨應用發送消息,需通過appkey+英文井號+用戶帳號的方式拼接,發送錄音、發送群組消息等與此方式一致。
   //例如:appkey=20150314000000110000000000000010 
              帳號ID=john  
              傳入帳號=20150314000000110000000000000010#john              
   //msg.setTo(""appkey#John的賬號");
    // 設置消息接收者
    msg.setTo("John的賬號");

    // 創建一個文本消息體,并添加到消息對象中
    ECTextMessageBody msgBody = new ECTextMessageBody(text.toString());

    // 或者創建一個圖片消息體 并且設置附件包體(其實圖片也是相當于附件)
    // 比如我們發送SD卡里面的一張Tony_2015.jpg圖片
    ECImageMessageBody msgBody  = new ECImageMessageBody();
    // 設置附件名
    msgBody.setFileName("Tony_2015.jpg");
    // 設置附件擴展名
    msgBody.setFileExt("jpg");
    // 設置附件本地路徑
    msgBody.setLocalUrl("../Tony_2015.jpg");

    // 或者創建一個創建附件消息體
    // 比如我們發送SD卡里面的一個Tony_2015.zip文件
    ECFileMessageBody msgBody  = new ECFileMessageBody();
    // 設置附件名
    msgBody.setFileName("Tony_2015.zip");
    // 設置附件擴展名
    msgBody.setFileExt(zip);
    // 設置附件本地路徑
    msgBody.setLocalUrl("../Tony_2015.zip");
    // 設置附件長度
    msgBody.setLength("Tony_2015.zip文件大小");

    // 將消息體存放到ECMessage中
    msg.setBody(msgBody);
    // 調用SDK發送接口發送消息到服務器
    ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 處理消息發送結果
            if(message == null) {
                return ;
            }
            // 將發送的消息更新到本地數據庫并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
            // 處理文件發送上傳進度(盡上傳文件、圖片時候SDK回調該方法)
        }
    });
} catch (Exception e) {
    // 處理發送異常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}

                    

? 發送語音

1、我們假設Tony給John發送一條語音,則代碼如下:(參考Demo中IMChattingHelper類和ChattingFragment類)

try {
    // 組建一個待發送的ECMessage
    ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE);
    // 設置消息接收者
    message.setTo("John的賬號");
    // 擴張字段,應用可以自定義規則
    message.setUserData("msgExt://amr");
    // 設置語音包體,語音錄制文件需要保存的目錄
    ECVoiceMessageBody messageBody = new ECVoiceMessageBody(new File("保存路徑"), 0);
    message.setBody(messageBody);
    // 僅錄制語音消息,錄制完成后需要調用發送接口發送消息
    ECChatManager manager = ECDevice.getECChatManager();
    manager.startVoiceRecording(message, 
            new ECChatManager.OnRecordTimeoutListener() {

        @Override
        public void onRecordingTimeOut(long duration) {
            // 如果語音錄制超過最大60s長度,則發送
            // 同時SDK停止當前語音錄制
        }

        @Override
        public void onRecordingAmplitude(
                double amplitude) {
            // 顯示聲音振幅

        }

    });
    // 調用SDk接口停止當前錄音
    manager.stopVoiceRecording(
            new ECChatManager.OnStopVoiceRecordingListener() {
        @Override
        public void onRecordingComplete() {
            // SDK停止錄音完成,調用SDK接口發送語音消息
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
//將ECMessage對象傳入sendMessage方法進行發送。

                    

2、我們假設Tony給John發送錄音變聲消息,則代碼如下:

Parameters parameters =new Parameters();
//輸入與輸出的文件地址
parameters.inFileName="";
parameters.outFileName"";
//例如:demo中如下填寫:
//parameters.inFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+mAmrPathName;
//parameters.outFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+appendName+mAmrPathName; 

//根據傳入不同的pitch及tempo會引起不同的變聲效果、以下的是demo中的效果
if("yuansheng".equals(appendName)){

}else if("luoli".equals(appendName)){
   parameters.pitch=12;  //- 12  12 
   parameters.tempo=1;  // -0.05 1
}else if("dashu".equals(appendName)){
   parameters.pitch=2;
   parameters.tempo=1;
}else if("jingsong".equals(appendName)){
   parameters.pitch=1;
   parameters.tempo=-3;
}else if("gaoguai".equals(appendName)){
   parameters.pitch=5;
   parameters.tempo=1;
}else if("kongling".equals(appendName)){
   parameters.pitch=1;
   parameters.tempo=-1;
}
return parameters;

file = new File("保存路徑");
ECChatManager().changeVoice(parameters, new OnChangeVoiceListener() {
@Override
public void onChangeVoice(ECError error, Parameters para) {
 if(error.errorCode==SdkErrorCode.REQUEST_SUCCESS){
   instance.playVoice(parameters.outFileName, false);
 }else {
   file.delete();
 }
}
});

//將變音文件組成一個待發送的ECMessage
ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE);
// 設置接收者、發送者、會話ID等信息
message.setForm("Tony的賬號");
message.setMsgTime(System.currentTimeMillis());
// 設置消息接收者
message.setTo("John的賬號");
message.setSessionId("John的賬號");
// 設置消息發送類型(發送或者接收)
message.setDirection(ECMessage.Direction.SEND);
// 擴張字段,應用可以自定義規則
message.setUserData("msgExt://amr");
// 設置語音包體,語音錄制文件需要保存的目錄
ECVoiceMessageBody messageBody = new ECVoiceMessageBody(file, 0);
message.setBody(messageBody);
//將ECMessage對象傳入sendMessage方法進行發送。

                    

? 地理位置

//經緯度
ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION);
        // 設置消息接收者
        msg.setTo(mRecipients);
        // 創建一個消息體,并添加到位置消息對象中
        ECLocationMessageBody msgBody = new ECLocationMessageBody("傳入lat", "傳入lon");
        msgBody.setTitle("位置信息");
        msg.setBody(msgBody);
        
ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 處理消息發送結果
            if(message == null) {
                return ;
            }
            // 將發送的消息更新到本地數據庫并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
        }
    });
} catch (Exception e) {
    // 處理發送異常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}

//將ECMessage對象傳入sendMessage方法進行發送

                    

? 接收消息—我們假設John收到Tony發送過來的消息,則代碼如下:

@Override
//如果是跨應用消息,發送者為appkey+英文井號+用戶帳號。
//例如:  appkey=20150314000000110000000000000010 
             帳號ID=john  
             發送者=20150314000000110000000000000010#john  
public void OnReceivedMessage(ECMessage msg) {
	if(msg == null) {
		return ;
	}
	// 接收到的IM消息,根據IM消息類型做不同的處理(IM消息類型:ECMessage.Type)
	ECMessage.Type type = msg.getType();
	if(type == ECMessage.Type.TXT) {
		// 在這里處理文本消息
		ECTextMessageBody textMessageBody = (ECTextMessageBody) msg.getBody();
	} else {

		String thumbnailFileUrl = null;
		String remoteUrl = null;
		if (type == ECMessage.Type.FILE) {
			// 在這里處理附件消息
			ECFileMessageBody fileMsgBody = (ECFileMessageBody) msg.getBody();
			// 獲得下載地址
			remoteUrl = fileMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.IMAGE) {
			// 在這里處理圖片消息
			ECImageMessageBody imageMsgBody = (ECImageMessageBody) msg.getBody();
			// 獲得縮略圖地址
			thumbnailFileUrl = imageMsgBody.getThumbnailFileUrl();
			// 獲得原圖地址
			remoteUrl = imageMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VOICE) {
			// 在這里處理語音消息
			ECVoiceMessageBody voiceMsgBody = (ECVoiceMessageBody) msg.getBody();
			// 獲得下載地址
			remoteUrl = voiceMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VIDEO) {
			// 在這里處理視頻消息
			ECVideoMessageBody videoMessageBody = (ECVideoMessageBody) msg.getBody();
			// 獲得下載地址
			remoteUrl = videoMessageBody.getRemoteUrl();
		} else if (type == ECMessage.Type.LOCATION) {
			// 在這里處理地理位置消息
			ECLocationMessageBody locationMessageBody = (ECLocationMessageBody) msg.getBody();
			// 獲得下載地址
			locationMessageBody.getLatitude(); // 緯度信息
			locationMessageBody.getLongitude();// 經度信息
		} else {
			Log.e("ECSDK_Demo" , "Can't handle msgType=" + type.name()
					+ " , then ignore.");
			// 后續還會支持(自定義等消息類型)
		}

		if(TextUtils.isEmpty(remoteUrl)) {
			return ;
		}
		if(!TextUtils.isEmpty(thumbnailFileUrl)) {
			// 先下載縮略圖
		} else {
			// 下載附件
		}
	}
	// 根據不同類型處理完消息之后,將消息序列化到本地存儲(sqlite)
	// 通知UI有新消息到達

}

                    

? 閱后即焚—閱后即焚(暫時只支持單聊)可以參考demo通過ECMessage中的擴展userData字段去實現、當接收方收到發送方發送過來的消息、解析userData字段發現是閱后即焚消息,在查看之后可以調用刪除閱后即焚消息、通知服務器刪除消息,同時發送方會收到消息被刪除的通知。 代碼如下:

1、接收方刪除閱后即焚消息
ECDevice.getECChatManager().deleteMessage("閱后即焚的消息的ECMessage對象", new OnDeleteMessageListener() {
  public void onDeleteMessage(ECError paramECError, ECMessage paramECMessage) {
     //處理刪除閱后即焚消息的回調、獲取刪除消息的結果響應
  }
});

2、發送方收到接收方刪除閱后即焚消息的通知
(通過實現OnChatReceiveListener中的 onReceiveMessageNotify方法可以獲取到消息被刪除的通知)
public void onReceiveMessageNotify(ECMessageNotify msg) {
  if(msg.getNotifyType()==NotifyType.DELETE){  //通過if判斷代表當前類型是刪除閱后即焚的通知
     ECMessageDeleteNotify deleteMsg=(ECMessageDeleteNotify) msg;
     //處理接收方刪除閱后即焚消息的通知、比如刪除本地圖片等
   }
}

                    

? 發送富文本消息—代碼如下:

ECMessage msg = ECMessage.createECMessage(ECMessage.Type.RICH_TEXT); //創建1個富文本消息
 msg.setTo(to); // 設置消息接收者

	
 // 創建一個富文本消息體 
 ECPreviewMessageBody msgBody = new ECPreviewMessageBody(); //富文本消息body
 //title標題、設置富文本消息的標題
 msgBody.setTitle(title); 
 //desc設置大概的描述信息 
 msgBody.setDescContent(desc);
 //設置解析網頁獲取的圖片的本地地址(apps需要將獲取的圖片保存到手機上)、sdk需要將圖片進行上傳。
 msgBody.setLocalUrl(xxx.jpg);
 //url設置富文本消息對應的網頁的url、當對方點擊時打開的網頁網址
 msgBody.setUrl(url); 
 //解析網頁圖片的url地址、設置當前富文本消息的一張圖片、解析網頁獲取該圖片的過程由開發者實現、
 //也可以參考demo使用jsoup或其他實現。
 msgBody.setRemoteUrl(imgUrl); 
 //將msgBody設置給該富文本消息
 msg.setBody(msgBody); 
 //獲取消息發送者管理
ECChatManager manager = ECDevice.getECChatManager();
//發送富文本消息
 manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 處理消息發送結果
            if(message == null) {
                return ;
            }
            // 將發送的消息更新到本地數據庫并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
            // 處理文件發送上傳進度
        }
    });
} catch (Exception e) {
    // 處理發送異常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}

                    

? 發送狀態消息—代碼如下:

        // 組建一個待發送的ECMessage
        ECMessage msg = ECMessage.createECMessage(ECMessage.Type.STATE);
        
        msg.setTo(mRecipients); // 設置消息接收者
        // 創建一個狀態消息體,并添加到消息對象中
        ECUserStateMessageBody msgBody = new ECUserStateMessageBody(state);//state當前聊天過程中的輸入狀態
        msg.setBody(msgBody);
	ECChatManager ecChatManager = ECDevice.getECChatManager(); //獲取發送消息管理者
	if(ecChatManager==null){
			return;
	}
	ecChatManager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {//發送狀態消息
			@Override
			public void onSendMessageComplete(ECError error, ECMessage message) {

			}

			@Override
			public void onProgress(String msgId, int totalByte, int progressByte) {

			}
	});

                    

? 撤回消息(僅支持發送成功后、在2分鐘之內進行撤回處理)—代碼如下:

ECChatManager manager = ECDevice.getECChatManager();//獲取消息發送者管理
 chatManager.revokeMessage(message, new ECChatManager.OnRevokeMessageListener() {
		@Override
		public void onRevokeMessage(ECError error, ECMessage message) {
			if(error.errorCode ==SdkErrorCode.REQUEST_SUCCESS){
									
				Log.d(“撤回成功");
									
			}else {
				Log.d(“撤回失敗");
			}
		}
	});
	
                    

? 把消息置為已讀—代碼如下:

ECChatManager ecChatManager = ECDevice.getECChatManager(); //獲取發送消息管理者
if(ecChatManager==null){
		return;
}
chatManager.readMessage(message, new ECChatManager.OnReadMessageListener() { 
        @Override 
    public void  onReadMessageResult(ECError error, ECMessage message) { 

    if(error.errorCode== SdkErrorCode.REQUEST_SUCCESS){ 

            Log.d(“置為已讀成功"); 
			} 
		 } 
		}
);

                    

? 設置會話置頂—代碼如下:

ECChatManager chatManager = SDKCoreHelper.getECChatManager();
        if(chatManager ==null){
            return null;
        }
        chatManager.setSessionToTop(sessionId, isTop, new ECChatManager.OnSetContactToTopListener() {
            @Override
            public void onSetContactResult(ECError error, String contact) {

                if(error.errorCode==SdkErrorCode.REQUEST_SUCCESS){
                    
                    Log.d(TAG,"設置成功");
            }else {
                    Log.d(TAG,"設置失敗");
            }
            }
        });
        
                    

? 獲取置頂會話列表—代碼如下:

ECChatManager chatManager =ECDevice.getECChatManager();
		if(chatManager ==null){
			return;
		}
		chatManager.getSessionsOfTop(new ECChatManager.OnGetSessionsOfTopListener() {
			@Override
			public void onGetSessionsOfTopResult(ECError error, String[] sessionsArr) {
				if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
					Log.d(TAG,”獲取成功");
				}else{
					Log.d(TAG,”獲取失敗");
				}
			}
		});
		
                    

? 取消發送消息(僅支持voiceBody、videoBody、fileBody、imageBody、preViewBody消息body、取消的回調結果在onSendMessageComplete回調中返回171259錯誤碼)—代碼如下:

ECChatManager chatManager =ECDevice.getECChatManager();
if(chatManager ==null){
	return;
}
chatManager.cancelSendMessage(message);

                    

2、群聊

? 發送文本\語音\圖片\附件—我們假設Tony給群組名為"出彩中國人"的群組發送消息,群聊與點對點唯一的區別在于
群聊的接收者賬號為群組ID,則代碼如下:(參考Demo中IMChattingHelper類和ChattingFragment類)

try {
    // 組建一個待發送的ECMessage
    ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
    //設置消息的屬性:發出者,接受者,發送時間等
    msg.setForm("Tony的賬號");
    msg.setMsgTime(System.currentTimeMillis());
    // 設置消息接收者
    msg.setTo("出彩的中國人群組ID");
    msg.setSessionId("出彩的中國人群組ID ");
    // 設置消息發送類型(發送或者接收)
    msg.setDirection(ECMessage.Direction.SEND);
    // 創建一個文本消息體,并添加到消息對象中
    ECTextMessageBody msgBody = new ECTextMessageBody("來自Tony的消息");
    msg.setBody(msgBody);

// 圖片、文件、語音可以參考點對點消息體創建
    // 調用SDK發送接口發送消息到服務器
    ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 處理消息發送結果
            if(message == null) {
                return ;
            }
            // 將發送的消息更新到本地數據庫并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
            // 處理文件發送上傳進度(盡上傳文件、圖片時候SDK回調該方法)
        }

        @Override
        public void onComplete(ECError error) {
            // 忽略
        }
    });
} catch (Exception e) {
    // 處理發送異常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}


                    

? 發送變聲消息 — 我們假設Tony給群組名為"出彩中國人"的群組發送錄音變聲消息,則代碼如下:

Parameters parameters =new Parameters();
//輸入與輸出的文件地址
parameters.inFileName="";
parameters.outFileName"";
//例如:demo中如下填寫:
//parameters.inFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+mAmrPathName;
//parameters.outFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+appendName+mAmrPathName; 

//根據傳入不同的pitch及tempo會引起不同的變聲效果、以下的是demo中的效果
if("yuansheng".equals(appendName)){

}else if("luoli".equals(appendName)){
   parameters.pitch=12;  //- 12  12 
   parameters.tempo=1;  // -0.05 1
}else if("dashu".equals(appendName)){
   parameters.pitch=2;
   parameters.tempo=1;
}else if("jingsong".equals(appendName)){
   parameters.pitch=1;
   parameters.tempo=-3;
}else if("gaoguai".equals(appendName)){
   parameters.pitch=5;
   parameters.tempo=1;
}else if("kongling".equals(appendName)){
   parameters.pitch=1;
   parameters.tempo=-1;
}
return parameters;

file = new File("保存路徑");
ECChatManager().changeVoice(parameters, new OnChangeVoiceListener() {
@Override
public void onChangeVoice(ECError error, Parameters para) {
 if(error.errorCode==SdkErrorCode.REQUEST_SUCCESS){
   instance.playVoice(parameters.outFileName, false);
 }else {
   file.delete();
 }
}
});

//將變音文件組成一個待發送的ECMessage
ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE);
// 設置接收者、發送者、會話ID等信息
message.setForm("Tony的賬號");
message.setMsgTime(System.currentTimeMillis());
// 設置消息接收者
msg.setTo("出彩的中國人群組ID");
msg.setSessionId("出彩的中國人群組ID ");
// 設置消息發送類型(發送或者接收)
message.setDirection(ECMessage.Direction.SEND);
// 擴張字段,應用可以自定義規則
message.setUserData("msgExt://amr");
// 設置語音包體,語音錄制文件需要保存的目錄
ECVoiceMessageBody messageBody = new ECVoiceMessageBody(file, 0);
message.setBody(messageBody);
//將ECMessage對象傳入sendMessage方法進行發送。

                    

? 地理位置

說明:關于發送地理位置,該功能需要用戶自己在客戶端通過發送消息的接口實現,SDK中沒有封裝具體的發送位置接口(android、ios均需用戶自己在客戶端實現)。

ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION);
        // 設置消息接收者
        msg.setTo(mRecipients);
        // 創建一個消息體,并添加到位置消息對象中
        ECLocationMessageBody msgBody = new ECLocationMessageBody("傳入lat", "傳入lon");
        msgBody.setTitle("位置信息");
        msg.setBody(msgBody);
        
ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 處理消息發送結果
            if(message == null) {
                return ;
            }
            // 將發送的消息更新到本地數據庫并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
        }
    });
} catch (Exception e) {
    // 處理發送異常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}

//將ECMessage對象傳入sendMessage方法進行發送

                    

? 接收消息—我們假設John是"出彩中國人"群組中的一員,則代碼如下:

public void OnReceivedMessage(ECMessage msg) {
	if(msg == null) {
		return ;
	}
	// 接收到的IM消息,根據IM消息類型做不同的處理(IM消息類型:ECMessage.Type)
	ECMessage.Type type = msg.getType();
	if(type == ECMessage.Type.TXT) {
		// 在這里處理文本消息
		ECTextMessageBody textMessageBody = (ECTextMessageBody) msg.getBody();
	} else {

		String thumbnailFileUrl = null;
		String remoteUrl = null;
		if (type == ECMessage.Type.FILE) {
			// 在這里處理附件消息
			ECFileMessageBody fileMsgBody = (ECFileMessageBody) msg.getBody();
			// 獲得下載地址
			remoteUrl = fileMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.IMAGE) {
			// 在這里處理圖片消息
			ECImageMessageBody imageMsgBody = (ECImageMessageBody) msg.getBody();
			// 獲得縮略圖地址
			thumbnailFileUrl = imageMsgBody.getThumbnailFileUrl();
			// 獲得原圖地址
			remoteUrl = imageMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VOICE) {
			// 在這里處理語音消息
			ECVoiceMessageBody voiceMsgBody = (ECVoiceMessageBody) msg.getBody();
			// 獲得下載地址
			remoteUrl = voiceMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VIDEO) {
			// 在這里處理語音消息
			ECVideoMessageBody videoMessageBody = (ECVideoMessageBody) msg.getBody();
			// 獲得下載地址
			remoteUrl = videoMessageBody.getRemoteUrl();
		} else if (type == ECMessage.Type.LOCATION) {
			// 在這里處理地理位置消息
			ECLocationMessageBody locationMessageBody = (ECLocationMessageBody) msg.getBody();
			// 獲得下載地址
			locationMessageBody.getLatitude(); // 緯度信息
			locationMessageBody.getLongitude();// 經度信息
		} else {
			Log.e("ECSDK_Demo" , "Can't handle msgType=" + type.name()
					+ " , then ignore.");
			// 后續還會支持(自定義等消息類型)
		}

		if(TextUtils.isEmpty(remoteUrl)) {
			return ;
		}
		if(!TextUtils.isEmpty(thumbnailFileUrl)) {
			// 先下載縮略圖
		} else {
			// 下載附件
		}
	}
	// 根據不同類型處理完消息之后,將消息序列化到本地存儲(sqlite)
	// 通知UI有新消息到達

}

                    

3、群組操作

? 創建群組/討論組—我們假設Tony要創建一個名為"出彩中國人",具體代碼如下:

// 構建群組參數
ECGroup group = new ECGroup();
// 設置群組名稱
group.setName("出彩中國人");
// 設置群組公告
group.setDeclare("歡迎體驗云通訊群組功能");
// 設置群組類型,如:ECGroup.Scope.TEMP臨時群組(100人)
group.setScope(ECGroup.Scope.TEMP);;
// 設置群組驗證權限,如:需要身份驗證ECGroup.Permission.NEED_AUTH
group.setPermission(ECGroup.Permission.NEED_AUTH);
// 設置群組創建者(可以不設置,服務器默認接口調用者為創建者)
group.setOwner("Tony的賬號");
//false代表是群組、true代表是討論組
group.setIsdiscuss(false);//是否是討論組
// 獲得SDK群組創建管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用創建群組接口,設置創建結果回調
groupManager.createGroup(group, new ECGroupManager.OnCreatGroupListener() {
    @Override
    public void onCreatGroupComplete(ECError error, ECGroup group) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
            // 群組/討論組創建成功
            // 緩存創建的群組/討論組到數據庫,同時通知UI進行更新
            return ;
        }
        // 群組/討論組創建失敗
        Log.e("ECSDK_Demo" , "create group fail , errorCode=" 
+ error.errorCode);
    }

    @Override
    public void onComplete(ECError error) {
        // 不需要處理忽略
    }
});

                    

? 主動加入—只要知道群組id,就可以主動加入群組。

1、我們假設"出彩中國人"群組已經有Tony和John兩位成員,現在Smith要加入"出彩中國人"群組,則代碼如下:

// 申請加入的群組id
String groupId = "出彩中國人群組ID";
// 設置申請加入理由
String declare = "Smith申請加入群組";
// 獲得SDK群組管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用審請加入群組接口,設置結果回調
groupManager.joinGroup(groupId, declare
        , new ECGroupManager.OnJoinGroupListener() {
    @Override
    public void onJoinGroupComplete(ECError error, String groupId) {
        if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode)
                || SdkErrorCode.MEMBER_ALREADY_EXIST == error.errorCode)) {
            // 申請加入群組成功(SdkErrorCode.MEMBER_ALREADY_EXIST代表
申請者已經是群組成員)
            // 根據申請的群組權限(permission字段)來區分
            // 是否直接加入成功或者需要管理員審核
            if(permission == 1) {
                // 群組申請不需要驗證,直接加入
                // 這里可以跳轉到群組聊天界面、更新UI
                return;
            }
            Toast.makeText(Context , "申請加入群組成功,請等待管理員審核" ,
                    Toast.LENGTH_SHORT).show();
            return ;
        }
        // 群組申請失敗
        Log.e("ECSDK_Demo", "join group fail , errorCode="
                + error.errorCode);

    }

    @Override
    public void onComplete(ECError error) {
        // 不需要處理忽略
    }
});


                    

注意:如果群組"出彩中國人"是公開群組,則smith直接被允許加入。如果群組"出彩中國人"是私有群組
則smith加入需要群主Tony的的同意。

關于幾種群組的解釋:
公開群組:用戶可以直接被允許加入群組,不需要群主進行驗證;
驗證群組:用戶加入群組的時候需要群主同意才可以加入
私有群組:只能群主邀請加入

Tony首先收到mith加入的請求,代碼如下:

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }
    // 有人申請加入群組(僅限于管理員)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.PROPOSE) {
        ECProposerMsg proposerMsg = (ECProposerMsg) notice;
        // 處理申請加入群組請求通知
    }

}


                    

Tony同意Smith加入的請求,代碼如下:

// 創建回復驗證參數響應狀態
// ECAckType.AGREE:通過 ECAckType.REJECT:拒絕
ECAckType ackType = ECAckType.AGREE;
// 所屬的群組ID
String groupId = "出彩中國人群組ID";
// 申請者賬號ECProposerMsg.getProposer()
String proposer = "Smith的賬號";
// 獲得SDK群組管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用驗證申請群組接口,設置結果回調
groupManager.ackJoinGroupRequest(groupId, proposer, ackType ,
        new ECGroupManager.OnAckJoinGroupRequestListener() {
            @Override
            public void onAckJoinGroupRequestComplete(ECError error
                    , String groupId, String member) {
                if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
                    // 回復群組申請成功
                    return ;
                }
                // 回復群組申失敗
                Log.e("ECSDK_Demo", "ack group apply fail , errorCode="
                        + error.errorCode);

            }

            @Override
            public void onComplete(ECError error) {
                // 忽略
            }
        }
);
                    

2、Smith加入成功后,群組中成員Tony和John收到的通知回調方法代碼如下:(參考Demo中的IMChattingHelper.java)

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }
    // 有人加入群組通知(群組成員)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.JOIN) {
        ECJoinGroupMsg joinGroupMsg = (ECJoinGroupMsg) notice;
        // 處理某人加入群組通知
    }
} 

                    

? 邀請加入—只能群主邀請別人加入

1、我們假設"出彩中國人"群組的創建者Tony邀請Smith加入群組,則代碼如下:(參考Demo中的CreateGroupActivity.java)

// 設置群組ID
String groupId = "出彩中國人群組ID";
// 設置邀請加入理由
String declare = "Tony邀請Smith加入群組";
// 設置邀請加入的群組成員(可多選)
String[] members = new String[]{"Smith的賬號"};
// 是否需要對方確認(NEED_CONFIRM 需要對方驗證,FORCE_PULL 不需要對方驗證)
ECGroupManager.InvitationMode confirm = ECGroupManager.InvitationMode.NEED_CONFIRM;
// 獲得SDK群組管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用邀請加入群組接口,設置結果回調
groupManager.inviteJoinGroup(groupId , declare ,members , confim
        ,new ECGroupManager.OnInviteJoinGroupListener() {
    @Override
    public void onComplete(ECError error) {
        // 可以忽略不需要處理
    }

    @Override
    public void onInviteJoinGroupComplete(ECError error
            , String groupId, String[] members) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
            // 邀請加入成功 ,1默認是直接就拉進群組
            if(confim == 1) {
                // 直接拉進群組,不需要被邀請成員是否同意
                return ;
            }
            Toast.makeText(Context , "邀請加入群組成功,請等待Smith驗證" ,
                    Toast.LENGTH_SHORT).show();
            return ;
        }
        // 群組邀請成員失敗
        Log.e("ECSDK_Demo", "invite join group fail , errorCode="
                + error.errorCode);

    }
});
                    

注意:如果Tony邀請Smith加入的時候,接口參數不指定加入需要Smith確認,則smith直接被邀請加入。如果指定需要Smith
同意才能加入,則Smith收到如下通知回調,并在回調里面回復"同意"或"拒絕"加入。代碼如下:

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }

    // 有人加入群組通知(群組成員)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.INVITE) {
        ECInviterMsg inviterMsg = (ECInviterMsg) notice;
        // 處理群組管理員邀請加入群組通知
        String groupId = inviterMsg.getGroupId();
    }
} 

// 創建回復驗證參數響應狀態
// ECAckType.AGREE:通過 ECAckType.REJECT:拒絕
ECAckType ackType = ECAckType.AGREE;
// 所屬的群組ID
String groupId = "出彩中國人群組ID";
// 邀請者賬號(ECInviterMsg.getAdmin())
String inviter = "Tony的賬號";
// 獲得SDK群組創建管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用回復邀請加入群組接口,設置結果回調
groupManager.ackInviteJoinGroupRequest(groupId, ackType,inviter,
        new ECGroupManager.OnAckInviteJoinGroupRequestListener() {
            @Override
            public void onAckInviteJoinGroupRequestComplete(ECError error , 
                                                            String groupId) {
                if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
                    // 回復群組邀請成功
                    return;
                }
                // 回復群組邀請失敗
                Log.e("ECSDK_Demo", "ack group apply fail , errorCode="
                        + error.errorCode);

            }

            @Override
            public void onComplete(ECError error) {
                // 忽略
            }
        }
);

                    

2、Smith加入成功后,群組中成員Tony和John收到的通知回調方法代碼如下:(參考Demo中的IMChattingHelper.java)

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }

    // 有人加入群組通知(群組成員)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.JOIN) {
        ECJoinGroupMsg joinGroupMsg = (ECJoinGroupMsg) notice;
        // 處理某人加入群組通知
    }
}
                    

? 退出群組

1、我們假設Smith要退出群組,則代碼如下:

// 設置需要退出的群組id
String groupId = "出彩中國人群組ID";
// 獲得SDK群組創建管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用退出群組接口,設置結果回調
groupManager.quitGroup(groupId, new ECGroupManager.OnQuitGroupListener() {
    @Override
    public void onQuitGroupComplete(ECError error, String groupId) {
        if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
            // 退出群組成功
            // 這里可以刪除本地群組緩存,刪除群組聊天紀錄等
            return;
        }
        // 退出群組失敗
        Log.e("ECSDK_Demo", "quit group fail , errorCode="
                + error.errorCode);
    }
    @Override
    public void onComplete(ECError error) {
        // 忽略
    }
});
                    

2、Smith退出成功后,群組中成員Tony和John收到的通知回調方法代碼如下:(參考Demo中的IMChattingHelper.java)

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }

    // 有人退出群組通知(群組成員)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.QUIT) {
        ECQuitGroupMsg quitGroupMsg = (ECQuitGroupMsg) notice;
        // 處理某人退出群組通知
    }
}
                    

? 群主踢人

1、我們假設群主Tony要把Smith要踢出群組,則代碼如下:

// Smith所在的群組id
String grouId = "出彩中國人群組ID";
// Smith賬號
String member = "Smith的賬號";
// 獲得SDK群組創建管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用群組移除成員接口,設置結果回調
groupManager.deleteGroupMember(grouId, member,
        new ECGroupManager.OnDeleteGroupMembersListener() {
    @Override
    public void onDeleteGroupMembersComplete(ECError error
            , String groupId, String members) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS){
            // 移除成員成功
            // 將Smith賬號從本地群組關聯關系中移除
            // 通知UI更新
            return;
        }
        // 退出群組失敗
        Log.e("ECSDK_Demo", "remove group member fail " +
                ", errorCode=" + error.errorCode);

    }

    @Override
    public void onComplete(ECError error) {
        // 忽略不處理
    }
});
 
                    

2、群組中所有成員都會收到的Smith被踢的消息,包括Smith自己,Smith判斷被踢用戶的id等于自己,
則從本地刪除群組,此通知回調方法代碼如下:(參考Demo中的IMChattingHelper.java)

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }

    // 有人被移除出群組
    if (notice.getType() == 
            ECGroupNoticeMessage.ECGroupMessageType.REMOVE_MEMBER) {
        ECRemoveMemberMsg removeMemberMsg = (ECRemoveMemberMsg) notice;
        // 處理群組移除成員通知
        if ("Smith賬號".equals(removeMemberMsg.getMember())) {
            // 如果是自己則將從本地群組關聯關系中移除
            // 通知UI處理刷新
        }

    }
}
                    

? 解散群組—只有群主才能解散群組。

1、我們假設群主Tony要解散"出彩中國人",則代碼如下:

// 被解散的群組id
String grouId = "出彩中國人群組ID";
// 獲得SDK群組創建管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用群組移解散接口,設置結果回調
groupManager.deleteGroup(groupId, new ECGroupManager.OnDeleteGroupListener() {
    @Override
    public void onDeleteGroupComplete(ECError error, String groupId) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS){
            // 群組解散成功
            // 將群組信息從本地緩存中刪除 通知UI更新
            return;
        }
        // 解散群組失敗
        Log.e("ECSDK_Demo", "del group fail " +
                ", errorCode=" + error.errorCode);

    }

    @Override
    public void onComplete(ECError error) {
        // 忽略不處理
    }
});


                    

2、群組中所有成員收到的通知回調方法代碼如下:

@Override
//該通知回調接口是初始化時設置的 
"設置SDK接收消息回調"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }
    // 群組被解散
    if (notice.getType() ==ECGroupNoticeMessage.ECGroupMessageType.DISMISS) {
        ECDismissGroupMsg dismissGroupMsg = (ECDismissGroupMsg) notice;
        // 處理群組被解散通知
        // 將群組從本地緩存中刪除并通知UI刷新
    }
}
                    

? 獲取群成員—代碼如下:(參考Demo中的GroupMemberService.java)

// 需要獲取群組成員的群組id
String grouId = "出彩中國人群組ID";
// 獲得SDK群組管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用獲取群組成員接口,設置結果回調
groupManager.queryGroupMembers(groupId,
        new ECGroupManager.OnQueryGroupMembersListener() {
            @Override
            public void onQueryGroupMembersComplete(ECError error
                    , List<ECGroupMember> members) {
                if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS 
&& members != null) {
                    // 獲取群組成員成功
                    // 將群組成員信息更新到本地緩存中(sqlite) 通知UI更新
                    return;
                }
                // 群組成員獲取失敗
                Log.e("ECSDK_Demo", "sync group detail fail " +
                        ", errorCode=" + error.errorCode);

            }

            @Override
            public void onComplete(ECError error) {
                // 忽略不處理
            }
        }
);


                    

? 群組搜索—可以根據群組名字或者群組ID來搜索群組(群組名稱為純數字或純字母時需要輸入完整的群名稱) ,代碼如下。 (參考Demo中的SearchGroupActivity.java)

// 創建查詢參數規則(按照群組id檢索)
ECGroupMatch match = new ECGroupMatch(ECGroupMatch.SearchType.GROUPID);
// 設置檢索詞(根據匹配規則輸入群組I的或者名稱)
match.setkeywords("出彩的中國人");
// 獲得SDK群組管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用檢索群組接口,設置結果回調
groupManager.searchPublicGroups(match, 
        new ECGroupManager.OnSearchPublicGroupsListener() {
    @Override
    public void onSearchPublicGroupsComplete(ECError error
            , List<ECGroup> groups) {
        if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS && groups != null){
            // 檢索群組成功
            // 根據查詢到的群組選擇是否申請加入群組
            return;
        }
        // 檢索群組取失敗
        Log.e("ECSDK_Demo", "search group fail " +
                ", errorCode=" + error.errorCode);

    }

    @Override
    public void onComplete(ECError error) {
        // 忽略不需要處理
    }
});


                    

? 獲取個人所在的群組—用戶登錄后,通常首先調取此接口獲取自己所在群組/討論組,此接口會返回群組的
id、名稱、免打擾狀態等信息,其示例代碼如下:

// 獲得SDK群組創建管理類
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 調用查詢個人加入的群組接口,設置結果回調
//Target.Group是群組,Target.Discussion是討論組
groupManager.queryOwnGroups(new ECGroupManager.OnQueryOwnGroupsListener() {
    @Override
    public void onQueryOwnGroupsComplete(ECError error, List groups){
        if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode) {
            // 請求成功
            // 進行本地數據庫與服務器數據同步
            // 刪除不存在或者沒有加入的群組
            return ;
        }

        // 查詢個人加入的群組失敗
        Log.e("ECSDK_Demo", "query own groups fail " +
                ", errorCode=" + error.errorCode);

    }

    @Override
    public void onComplete(ECError error) {
        // 忽略
    }
});

                    

4、離線消息

1、用戶登錄以后,應該首先獲取自己的云通訊服務端的離線條數,具體代碼如下:(參考Demo中的IMChattingHelper.java)

@Override
public void onOfflineMessageCount(int count) {
    // 注冊SDK的參數需要設置如下才能收到該回調
    // ECInitParams.setOnChatReceiveListener(new OnChatReceiveListener());
    // count參數標識當前賬號的離線消息數
}


                    

2、根據總的離線條數,決定獲取多少條離線消息,具體代碼如下:如下:(參考Demo中的IMChattingHelper.java)

@Override
public int onGetOfflineMessage() {
    // 注冊SDK的參數需要設置如下才能收到該回調
    // ECInitParams.setOnChatReceiveListener(new OnChatReceiveListener());
    // 建議根據onHistoryMessageCount(int count)設置接收的離線消息數
// 消息數 ECDevice.SYNC_OFFLINE_MSG_ALL:全部獲取 0:不獲取
    return count;
} 


                    

3、客戶端處理 SDk拉取的離線消息

@Override
public void onReceiveOfflineMessage(List<ECMessage> msgs) {
    // 離線消息的處理可以參考 void OnReceivedMessage(ECMessage msg)方法
    // 處理邏輯完全一樣
    // 參考 IMChattingHelper.java
}


                    

4、客戶端處理離線消息拉取完成通知

@Override
public void onReceiveOfflineMessageCompletion() {
    // SDK離線消息拉取完成之后會通過該接口通知應用
    // 應用可以在此做類似于Loading框的關閉,Notification通知等等
}

                    

5、自定義消息

自定義消息通過發送文本消息接口擴展字段來實現,具體說明如下:(參考Demo中的ChattingActivity.java)



try {
    // 組建一個待發送的ECMessage
    ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
    //設置消息的屬性:發出者,接受者,發送時間等
    msg.setForm("Tony的賬號");
    msg.setMsgTime(System.currentTimeMillis());
    // 設置消息接收者
    msg.setTo("John的賬號");
    msg.setSessionId("John的賬號");
    // 設置消息發送類型(發送或者接收)
    msg.setDirection(ECMessage.Direction.SEND);
    // 創建一個文本消息體,并添加到消息對象中
    // 文本消息由用戶自定義組裝,接收端按照規則解析
    ECTextMessageBody msgBody = new ECTextMessageBody("Location");
    msg.setBody(msgBody);
    
    // 設置自定義消息類型如:(位置)
    msg.setUserData("msgType://Location");
    // 調用SDK發送文本接口發送消息到服務器
    // 參考發送文本消息
} catch (Exception e) {
    // 處理發送異常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}
                    

6、設置個人信息

可以通過接口設置個人信息,包括昵稱、生日、性別,建議昵稱必須設置,以便在推送消息的時候使用,具體代碼如下:
(參考Demo中的SettingPersionInfoActivity.java)

				
        PersonInfo personInfo =new PersonInfo();
        // 設置生日(格式:2015-5-13);
        personInfo.setBirth("2015-5-13");
        // 設置昵稱
        personInfo.setNickName("Tony");
        // 設置性別(男:1 , 女:2)
        personInfo.setSex("1");
        // 設置備注
        personInfo.setSign("你好,我是Tony");
	
        ECDevice.setPersonInfo(personInfo, new ECDevice.OnSetPersonInfoListener() {
            @Override
            public void onSetPersonInfoComplete(ECError e, int version) {
             if (SdkErrorCode.REQUEST_SUCCESS == error.errorCode) {
            // 個人信息設置成功,version最新的個人信息版本號
            // 更新個人信息到本地數據庫,通知UI刷新
            return;
             }
           Log.e("ECSDK_Demo", "set person info fail  " +
                ", errorCode=" + e.errorCode);
    }
});
                    

7、獲取個人信息

獲取個人信息代碼如下:(參考Demo中的IMChattingHelper.java)

// 調用查詢個人信息接口,設置結果回調
ECDevice.getPersonInfo(userId, new ECDevice.OnGetPersonInfoListener() {
   @Override
   public void onGetPersonInfoComplete(ECError e, PersonInfo p){
        if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode) {
            // 個人信息獲取成功
            // 更新個人信息到本地數據庫,通知UI刷新
            return ;
        }
        Log.e("ECSDK_Demo", "get person info fail  " +
                ", errorCode=" + e.errorCode);
    }
});
                    

8、設置免打擾

    /**
     * SDK增加設置免打擾接口 獲取免打擾列表為服務器rest接口
     * @param userId    用戶id
     * @param enable    免打擾使能
     * @param l         免打擾列表
     */
    ECDevice.setMuteNotification("uid", true, new ECDevice.OnSetDisturbListener() {
            @Override
            public void onResult(ECError ecError) {
                //返回設置成功錯誤碼
            }
        });
                    

文檔更新時間:2017年12月12日

主站蜘蛛池模板: 久久不射电影网 | 九九国产 | 欧美一区二区黄 | 久久久久久亚洲精品 | 国产精品无码永久免费888 | 亚洲精品久久久久久久久久吃药 | 北条麻妃视频在线观看 | 国内精品久久久久久 | 欧美日在线 | 日韩在线91 | 日韩福利在线 | 亚洲伊人a | 国产高潮好爽受不了了夜夜做 | 最新中文字幕 | 找个黄色片 | 国产日产精品一区二区三区四区 | 欧美一区免费在线观看 | 久久精品小视频 | 免费观看的黄色网址 | 久久精品国产一区 | 成人三级网址 | 成人国产一区二区三区精品麻豆 | 成人午夜影院 | 欧美精品在线播放 | 一级片av | 成人中文网 | 91免费入口 | 欧美福利| 亚洲一区二区电影网 | 91资源在线观看 | 人人叉| 精品美女 | 999国产视频| 免费看黄色小视频 | 精品国产乱码一区二区三 | 青青艹在线视频 | 久久国| 日韩视频三区 | 久久久久午夜 | 欧美大片黄 | 欧美寡妇偷汉性猛交 |