try { // 組建一個(gè)待發(fā)送的ECMessage ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT); //如果需要跨應(yīng)用發(fā)送消息,需通過appkey+英文井號+用戶帳號的方式拼接,發(fā)送錄音、發(fā)送群組消息等與此方式一致。 //例如:appkey=20150314000000110000000000000010 帳號ID=john 傳入帳號=20150314000000110000000000000010#john //msg.setTo(""appkey#John的賬號"); // 設(shè)置消息接收者 msg.setTo("John的賬號"); // 創(chuàng)建一個(gè)文本消息體,并添加到消息對象中 ECTextMessageBody msgBody = new ECTextMessageBody(text.toString()); // 或者創(chuàng)建一個(gè)圖片消息體 并且設(shè)置附件包體(其實(shí)圖片也是相當(dāng)于附件) // 比如我們發(fā)送SD卡里面的一張Tony_2015.jpg圖片 ECImageMessageBody msgBody = new ECImageMessageBody(); // 設(shè)置附件名 msgBody.setFileName("Tony_2015.jpg"); // 設(shè)置附件擴(kuò)展名 msgBody.setFileExt("jpg"); // 設(shè)置附件本地路徑 msgBody.setLocalUrl("../Tony_2015.jpg"); // 或者創(chuàng)建一個(gè)創(chuàng)建附件消息體 // 比如我們發(fā)送SD卡里面的一個(gè)Tony_2015.zip文件 ECFileMessageBody msgBody = new ECFileMessageBody(); // 設(shè)置附件名 msgBody.setFileName("Tony_2015.zip"); // 設(shè)置附件擴(kuò)展名 msgBody.setFileExt(zip); // 設(shè)置附件本地路徑 msgBody.setLocalUrl("../Tony_2015.zip"); // 設(shè)置附件長度 msgBody.setLength("Tony_2015.zip文件大小"); // 將消息體存放到ECMessage中 msg.setBody(msgBody); // 調(diào)用SDK發(fā)送接口發(fā)送消息到服務(wù)器 ECChatManager manager = ECDevice.getECChatManager(); manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() { @Override public void onSendMessageComplete(ECError error, ECMessage message) { // 處理消息發(fā)送結(jié)果 if(message == null) { return ; } // 將發(fā)送的消息更新到本地?cái)?shù)據(jù)庫并刷新UI } @Override public void onProgress(String msgId, int totalByte, int progressByte) { // 處理文件發(fā)送上傳進(jìn)度(盡上傳文件、圖片時(shí)候SDK回調(diào)該方法) } }); } catch (Exception e) { // 處理發(fā)送異常 Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage()); }
try { // 組建一個(gè)待發(fā)送的ECMessage ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE); // 設(shè)置消息接收者 message.setTo("John的賬號"); // 擴(kuò)張字段,應(yīng)用可以自定義規(guī)則 message.setUserData("msgExt://amr"); // 設(shè)置語音包體,語音錄制文件需要保存的目錄 ECVoiceMessageBody messageBody = new ECVoiceMessageBody(new File("保存路徑"), 0); message.setBody(messageBody); // 僅錄制語音消息,錄制完成后需要調(diào)用發(fā)送接口發(fā)送消息 ECChatManager manager = ECDevice.getECChatManager(); manager.startVoiceRecording(message, new ECChatManager.OnRecordTimeoutListener() { @Override public void onRecordingTimeOut(long duration) { // 如果語音錄制超過最大60s長度,則發(fā)送 // 同時(shí)SDK停止當(dāng)前語音錄制 } @Override public void onRecordingAmplitude( double amplitude) { // 顯示聲音振幅 } }); // 調(diào)用SDk接口停止當(dāng)前錄音 manager.stopVoiceRecording( new ECChatManager.OnStopVoiceRecordingListener() { @Override public void onRecordingComplete() { // SDK停止錄音完成,調(diào)用SDK接口發(fā)送語音消息 } }); } catch (Exception e) { e.printStackTrace(); } //將ECMessage對象傳入sendMessage方法進(jìn)行發(fā)送。
Parameters parameters =new Parameters(); //輸入與輸出的文件地址 parameters.inFileName=""; parameters.outFileName""; //例如:demo中如下填寫: //parameters.inFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+mAmrPathName; //parameters.outFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+appendName+mAmrPathName; //根據(jù)傳入不同的pitch及tempo會(huì)引起不同的變聲效果、以下的是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(); } } }); //將變音文件組成一個(gè)待發(fā)送的ECMessage ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE); // 設(shè)置接收者、發(fā)送者、會(huì)話ID等信息 message.setForm("Tony的賬號"); message.setMsgTime(System.currentTimeMillis()); // 設(shè)置消息接收者 message.setTo("John的賬號"); message.setSessionId("John的賬號"); // 設(shè)置消息發(fā)送類型(發(fā)送或者接收) message.setDirection(ECMessage.Direction.SEND); // 擴(kuò)張字段,應(yīng)用可以自定義規(guī)則 message.setUserData("msgExt://amr"); // 設(shè)置語音包體,語音錄制文件需要保存的目錄 ECVoiceMessageBody messageBody = new ECVoiceMessageBody(file, 0); message.setBody(messageBody); //將ECMessage對象傳入sendMessage方法進(jìn)行發(fā)送。
//經(jīng)緯度 ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION); // 設(shè)置消息接收者 msg.setTo(mRecipients); // 創(chuàng)建一個(gè)消息體,并添加到位置消息對象中 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) { // 處理消息發(fā)送結(jié)果 if(message == null) { return ; } // 將發(fā)送的消息更新到本地?cái)?shù)據(jù)庫并刷新UI } @Override public void onProgress(String msgId, int totalByte, int progressByte) { } }); } catch (Exception e) { // 處理發(fā)送異常 Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage()); } //將ECMessage對象傳入sendMessage方法進(jìn)行發(fā)送
@Override //如果是跨應(yīng)用消息,發(fā)送者為appkey+英文井號+用戶帳號。 //例如: appkey=20150314000000110000000000000010 帳號ID=john 發(fā)送者=20150314000000110000000000000010#john public void OnReceivedMessage(ECMessage msg) { if(msg == null) { return ; } // 接收到的IM消息,根據(jù)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();// 經(jīng)度信息 } else { Log.e("ECSDK_Demo" , "Can't handle msgType=" + type.name() + " , then ignore."); // 后續(xù)還會(huì)支持(自定義等消息類型) } if(TextUtils.isEmpty(remoteUrl)) { return ; } if(!TextUtils.isEmpty(thumbnailFileUrl)) { // 先下載縮略圖 } else { // 下載附件 } } // 根據(jù)不同類型處理完消息之后,將消息序列化到本地存儲(chǔ)(sqlite) // 通知UI有新消息到達(dá) }
1、接收方刪除閱后即焚消息 ECDevice.getECChatManager().deleteMessage("閱后即焚的消息的ECMessage對象", new OnDeleteMessageListener() { public void onDeleteMessage(ECError paramECError, ECMessage paramECMessage) { //處理刪除閱后即焚消息的回調(diào)、獲取刪除消息的結(jié)果響應(yīng) } }); 2、發(fā)送方收到接收方刪除閱后即焚消息的通知 (通過實(shí)現(xiàn)OnChatReceiveListener中的 onReceiveMessageNotify方法可以獲取到消息被刪除的通知) public void onReceiveMessageNotify(ECMessageNotify msg) { if(msg.getNotifyType()==NotifyType.DELETE){ //通過if判斷代表當(dāng)前類型是刪除閱后即焚的通知 ECMessageDeleteNotify deleteMsg=(ECMessageDeleteNotify) msg; //處理接收方刪除閱后即焚消息的通知、比如刪除本地圖片等 } }
ECMessage msg = ECMessage.createECMessage(ECMessage.Type.RICH_TEXT); //創(chuàng)建1個(gè)富文本消息 msg.setTo(to); // 設(shè)置消息接收者 // 創(chuàng)建一個(gè)富文本消息體 ECPreviewMessageBody msgBody = new ECPreviewMessageBody(); //富文本消息body //title標(biāo)題、設(shè)置富文本消息的標(biāo)題 msgBody.setTitle(title); //desc設(shè)置大概的描述信息 msgBody.setDescContent(desc); //設(shè)置解析網(wǎng)頁獲取的圖片的本地地址(apps需要將獲取的圖片保存到手機(jī)上)、sdk需要將圖片進(jìn)行上傳。 msgBody.setLocalUrl(xxx.jpg); //url設(shè)置富文本消息對應(yīng)的網(wǎng)頁的url、當(dāng)對方點(diǎn)擊時(shí)打開的網(wǎng)頁網(wǎng)址 msgBody.setUrl(url); //解析網(wǎng)頁圖片的url地址、設(shè)置當(dāng)前富文本消息的一張圖片、解析網(wǎng)頁獲取該圖片的過程由開發(fā)者實(shí)現(xiàn)、 //也可以參考demo使用jsoup或其他實(shí)現(xiàn)。 msgBody.setRemoteUrl(imgUrl); //將msgBody設(shè)置給該富文本消息 msg.setBody(msgBody); //獲取消息發(fā)送者管理 ECChatManager manager = ECDevice.getECChatManager(); //發(fā)送富文本消息 manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() { @Override public void onSendMessageComplete(ECError error, ECMessage message) { // 處理消息發(fā)送結(jié)果 if(message == null) { return ; } // 將發(fā)送的消息更新到本地?cái)?shù)據(jù)庫并刷新UI } @Override public void onProgress(String msgId, int totalByte, int progressByte) { // 處理文件發(fā)送上傳進(jìn)度 } }); } catch (Exception e) { // 處理發(fā)送異常 Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage()); }
// 組建一個(gè)待發(fā)送的ECMessage ECMessage msg = ECMessage.createECMessage(ECMessage.Type.STATE); msg.setTo(mRecipients); // 設(shè)置消息接收者 // 創(chuàng)建一個(gè)狀態(tài)消息體,并添加到消息對象中 ECUserStateMessageBody msgBody = new ECUserStateMessageBody(state);//state當(dāng)前聊天過程中的輸入狀態(tài) msg.setBody(msgBody); ECChatManager ecChatManager = ECDevice.getECChatManager(); //獲取發(fā)送消息管理者 if(ecChatManager==null){ return; } ecChatManager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {//發(fā)送狀態(tài)消息 @Override public void onSendMessageComplete(ECError error, ECMessage message) { } @Override public void onProgress(String msgId, int totalByte, int progressByte) { } });
ECChatManager manager = ECDevice.getECChatManager();//獲取消息發(fā)送者管理 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(); //獲取發(fā)送消息管理者 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,"設(shè)置成功"); }else { Log.d(TAG,"設(shè)置失敗"); } } });
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,”獲取失敗"); } } });
ECChatManager chatManager =ECDevice.getECChatManager(); if(chatManager ==null){ return; } chatManager.cancelSendMessage(message);
try { // 組建一個(gè)待發(fā)送的ECMessage ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT); //設(shè)置消息的屬性:發(fā)出者,接受者,發(fā)送時(shí)間等 msg.setForm("Tony的賬號"); msg.setMsgTime(System.currentTimeMillis()); // 設(shè)置消息接收者 msg.setTo("出彩的中國人群組ID"); msg.setSessionId("出彩的中國人群組ID "); // 設(shè)置消息發(fā)送類型(發(fā)送或者接收) msg.setDirection(ECMessage.Direction.SEND); // 創(chuàng)建一個(gè)文本消息體,并添加到消息對象中 ECTextMessageBody msgBody = new ECTextMessageBody("來自Tony的消息"); msg.setBody(msgBody); // 圖片、文件、語音可以參考點(diǎn)對點(diǎn)消息體創(chuàng)建 // 調(diào)用SDK發(fā)送接口發(fā)送消息到服務(wù)器 ECChatManager manager = ECDevice.getECChatManager(); manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() { @Override public void onSendMessageComplete(ECError error, ECMessage message) { // 處理消息發(fā)送結(jié)果 if(message == null) { return ; } // 將發(fā)送的消息更新到本地?cái)?shù)據(jù)庫并刷新UI } @Override public void onProgress(String msgId, int totalByte, int progressByte) { // 處理文件發(fā)送上傳進(jìn)度(盡上傳文件、圖片時(shí)候SDK回調(diào)該方法) } @Override public void onComplete(ECError error) { // 忽略 } }); } catch (Exception e) { // 處理發(fā)送異常 Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage()); }
Parameters parameters =new Parameters(); //輸入與輸出的文件地址 parameters.inFileName=""; parameters.outFileName""; //例如:demo中如下填寫: //parameters.inFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+mAmrPathName; //parameters.outFileName=FileAccessor.getVoicePathName().getAbsolutePath()+"/"+appendName+mAmrPathName; //根據(jù)傳入不同的pitch及tempo會(huì)引起不同的變聲效果、以下的是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(); } } }); //將變音文件組成一個(gè)待發(fā)送的ECMessage ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE); // 設(shè)置接收者、發(fā)送者、會(huì)話ID等信息 message.setForm("Tony的賬號"); message.setMsgTime(System.currentTimeMillis()); // 設(shè)置消息接收者 msg.setTo("出彩的中國人群組ID"); msg.setSessionId("出彩的中國人群組ID "); // 設(shè)置消息發(fā)送類型(發(fā)送或者接收) message.setDirection(ECMessage.Direction.SEND); // 擴(kuò)張字段,應(yīng)用可以自定義規(guī)則 message.setUserData("msgExt://amr"); // 設(shè)置語音包體,語音錄制文件需要保存的目錄 ECVoiceMessageBody messageBody = new ECVoiceMessageBody(file, 0); message.setBody(messageBody); //將ECMessage對象傳入sendMessage方法進(jìn)行發(fā)送。
說明:關(guān)于發(fā)送地理位置,該功能需要用戶自己在客戶端通過發(fā)送消息的接口實(shí)現(xiàn),SDK中沒有封裝具體的發(fā)送位置接口(android、ios均需用戶自己在客戶端實(shí)現(xiàn))。
ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION); // 設(shè)置消息接收者 msg.setTo(mRecipients); // 創(chuàng)建一個(gè)消息體,并添加到位置消息對象中 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) { // 處理消息發(fā)送結(jié)果 if(message == null) { return ; } // 將發(fā)送的消息更新到本地?cái)?shù)據(jù)庫并刷新UI } @Override public void onProgress(String msgId, int totalByte, int progressByte) { } }); } catch (Exception e) { // 處理發(fā)送異常 Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage()); } //將ECMessage對象傳入sendMessage方法進(jìn)行發(fā)送
public void OnReceivedMessage(ECMessage msg) { if(msg == null) { return ; } // 接收到的IM消息,根據(jù)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();// 經(jīng)度信息 } else { Log.e("ECSDK_Demo" , "Can't handle msgType=" + type.name() + " , then ignore."); // 后續(xù)還會(huì)支持(自定義等消息類型) } if(TextUtils.isEmpty(remoteUrl)) { return ; } if(!TextUtils.isEmpty(thumbnailFileUrl)) { // 先下載縮略圖 } else { // 下載附件 } } // 根據(jù)不同類型處理完消息之后,將消息序列化到本地存儲(chǔ)(sqlite) // 通知UI有新消息到達(dá) }
// 構(gòu)建群組參數(shù) ECGroup group = new ECGroup(); // 設(shè)置群組名稱 group.setName("出彩中國人"); // 設(shè)置群組公告 group.setDeclare("歡迎體驗(yàn)云通訊群組功能"); // 設(shè)置群組類型,如:ECGroup.Scope.TEMP臨時(shí)群組(100人) group.setScope(ECGroup.Scope.TEMP);; // 設(shè)置群組驗(yàn)證權(quán)限,如:需要身份驗(yàn)證ECGroup.Permission.NEED_AUTH group.setPermission(ECGroup.Permission.NEED_AUTH); // 設(shè)置群組創(chuàng)建者(可以不設(shè)置,服務(wù)器默認(rèn)接口調(diào)用者為創(chuàng)建者) group.setOwner("Tony的賬號"); //false代表是群組、true代表是討論組 group.setIsdiscuss(false);//是否是討論組 // 獲得SDK群組創(chuàng)建管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用創(chuàng)建群組接口,設(shè)置創(chuàng)建結(jié)果回調(diào) groupManager.createGroup(group, new ECGroupManager.OnCreatGroupListener() { @Override public void onCreatGroupComplete(ECError error, ECGroup group) { if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) { // 群組/討論組創(chuàng)建成功 // 緩存創(chuàng)建的群組/討論組到數(shù)據(jù)庫,同時(shí)通知UI進(jìn)行更新 return ; } // 群組/討論組創(chuàng)建失敗 Log.e("ECSDK_Demo" , "create group fail , errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 不需要處理忽略 } });
1、我們假設(shè)"出彩中國人"群組已經(jīng)有Tony和John兩位成員,現(xiàn)在Smith要加入"出彩中國人"群組,則代碼如下:
// 申請加入的群組id String groupId = "出彩中國人群組ID"; // 設(shè)置申請加入理由 String declare = "Smith申請加入群組"; // 獲得SDK群組管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用審請加入群組接口,設(shè)置結(jié)果回調(diào) 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代表 申請者已經(jīng)是群組成員) // 根據(jù)申請的群組權(quán)限(permission字段)來區(qū)分 // 是否直接加入成功或者需要管理員審核 if(permission == 1) { // 群組申請不需要驗(yàn)證,直接加入 // 這里可以跳轉(zhuǎn)到群組聊天界面、更新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的的同意。
關(guān)于幾種群組的解釋:
公開群組:用戶可以直接被允許加入群組,不需要群主進(jìn)行驗(yàn)證;
驗(yàn)證群組:用戶加入群組的時(shí)候需要群主同意才可以加入
私有群組:只能群主邀請加入
Tony首先收到mith加入的請求,代碼如下:
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—OnChatReceiveListener public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { if (notice == null) { return; } // 有人申請加入群組(僅限于管理員) if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.PROPOSE) { ECProposerMsg proposerMsg = (ECProposerMsg) notice; // 處理申請加入群組請求通知 } }
Tony同意Smith加入的請求,代碼如下:
// 創(chuàng)建回復(fù)驗(yàn)證參數(shù)響應(yīng)狀態(tài) // ECAckType.AGREE:通過 ECAckType.REJECT:拒絕 ECAckType ackType = ECAckType.AGREE; // 所屬的群組ID String groupId = "出彩中國人群組ID"; // 申請者賬號ECProposerMsg.getProposer() String proposer = "Smith的賬號"; // 獲得SDK群組管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用驗(yàn)證申請群組接口,設(shè)置結(jié)果回調(diào) groupManager.ackJoinGroupRequest(groupId, proposer, ackType , new ECGroupManager.OnAckJoinGroupRequestListener() { @Override public void onAckJoinGroupRequestComplete(ECError error , String groupId, String member) { if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) { // 回復(fù)群組申請成功 return ; } // 回復(fù)群組申失敗 Log.e("ECSDK_Demo", "ack group apply fail , errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 忽略 } } );
2、Smith加入成功后,群組中成員Tony和John收到的通知回調(diào)方法代碼如下:(參考Demo中的IMChattingHelper.java)
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—OnChatReceiveListener public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { if (notice == null) { return; } // 有人加入群組通知(群組成員) if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.JOIN) { ECJoinGroupMsg joinGroupMsg = (ECJoinGroupMsg) notice; // 處理某人加入群組通知 } }
1、我們假設(shè)"出彩中國人"群組的創(chuàng)建者Tony邀請Smith加入群組,則代碼如下:(參考Demo中的CreateGroupActivity.java)
// 設(shè)置群組ID String groupId = "出彩中國人群組ID"; // 設(shè)置邀請加入理由 String declare = "Tony邀請Smith加入群組"; // 設(shè)置邀請加入的群組成員(可多選) String[] members = new String[]{"Smith的賬號"}; // 是否需要對方確認(rèn)(NEED_CONFIRM 需要對方驗(yàn)證,F(xiàn)ORCE_PULL 不需要對方驗(yàn)證) ECGroupManager.InvitationMode confirm = ECGroupManager.InvitationMode.NEED_CONFIRM; // 獲得SDK群組管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用邀請加入群組接口,設(shè)置結(jié)果回調(diào) 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默認(rèn)是直接就拉進(jìn)群組 if(confim == 1) { // 直接拉進(jìn)群組,不需要被邀請成員是否同意 return ; } Toast.makeText(Context , "邀請加入群組成功,請等待Smith驗(yàn)證" , Toast.LENGTH_SHORT).show(); return ; } // 群組邀請成員失敗 Log.e("ECSDK_Demo", "invite join group fail , errorCode=" + error.errorCode); } });
注意:如果Tony邀請Smith加入的時(shí)候,接口參數(shù)不指定加入需要Smith確認(rèn),則smith直接被邀請加入。如果指定需要Smith
同意才能加入,則Smith收到如下通知回調(diào),并在回調(diào)里面回復(fù)"同意"或"拒絕"加入。代碼如下:
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—OnChatReceiveListener public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { if (notice == null) { return; } // 有人加入群組通知(群組成員) if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.INVITE) { ECInviterMsg inviterMsg = (ECInviterMsg) notice; // 處理群組管理員邀請加入群組通知 String groupId = inviterMsg.getGroupId(); } } // 創(chuàng)建回復(fù)驗(yàn)證參數(shù)響應(yīng)狀態(tài) // ECAckType.AGREE:通過 ECAckType.REJECT:拒絕 ECAckType ackType = ECAckType.AGREE; // 所屬的群組ID String groupId = "出彩中國人群組ID"; // 邀請者賬號(ECInviterMsg.getAdmin()) String inviter = "Tony的賬號"; // 獲得SDK群組創(chuàng)建管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用回復(fù)邀請加入群組接口,設(shè)置結(jié)果回調(diào) groupManager.ackInviteJoinGroupRequest(groupId, ackType,inviter, new ECGroupManager.OnAckInviteJoinGroupRequestListener() { @Override public void onAckInviteJoinGroupRequestComplete(ECError error , String groupId) { if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) { // 回復(fù)群組邀請成功 return; } // 回復(fù)群組邀請失敗 Log.e("ECSDK_Demo", "ack group apply fail , errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 忽略 } } );
2、Smith加入成功后,群組中成員Tony和John收到的通知回調(diào)方法代碼如下:(參考Demo中的IMChattingHelper.java)
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—OnChatReceiveListener public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { if (notice == null) { return; } // 有人加入群組通知(群組成員) if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.JOIN) { ECJoinGroupMsg joinGroupMsg = (ECJoinGroupMsg) notice; // 處理某人加入群組通知 } }
1、我們假設(shè)Smith要退出群組,則代碼如下:
// 設(shè)置需要退出的群組id String groupId = "出彩中國人群組ID"; // 獲得SDK群組創(chuàng)建管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用退出群組接口,設(shè)置結(jié)果回調(diào) groupManager.quitGroup(groupId, new ECGroupManager.OnQuitGroupListener() { @Override public void onQuitGroupComplete(ECError error, String groupId) { if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) { // 退出群組成功 // 這里可以刪除本地群組緩存,刪除群組聊天紀(jì)錄等 return; } // 退出群組失敗 Log.e("ECSDK_Demo", "quit group fail , errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 忽略 } });
2、Smith退出成功后,群組中成員Tony和John收到的通知回調(diào)方法代碼如下:(參考Demo中的IMChattingHelper.java)
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—OnChatReceiveListener public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { if (notice == null) { return; } // 有人退出群組通知(群組成員) if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.QUIT) { ECQuitGroupMsg quitGroupMsg = (ECQuitGroupMsg) notice; // 處理某人退出群組通知 } }
1、我們假設(shè)群主Tony要把Smith要踢出群組,則代碼如下:
// Smith所在的群組id String grouId = "出彩中國人群組ID"; // Smith賬號 String member = "Smith的賬號"; // 獲得SDK群組創(chuàng)建管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用群組移除成員接口,設(shè)置結(jié)果回調(diào) groupManager.deleteGroupMember(grouId, member, new ECGroupManager.OnDeleteGroupMembersListener() { @Override public void onDeleteGroupMembersComplete(ECError error , String groupId, String members) { if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS){ // 移除成員成功 // 將Smith賬號從本地群組關(guān)聯(lián)關(guān)系中移除 // 通知UI更新 return; } // 退出群組失敗 Log.e("ECSDK_Demo", "remove group member fail " + ", errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 忽略不處理 } });
2、群組中所有成員都會(huì)收到的Smith被踢的消息,包括Smith自己,Smith判斷被踢用戶的id等于自己,
則從本地刪除群組,此通知回調(diào)方法代碼如下:(參考Demo中的IMChattingHelper.java)
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—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())) { // 如果是自己則將從本地群組關(guān)聯(lián)關(guān)系中移除 // 通知UI處理刷新 } } }
1、我們假設(shè)群主Tony要解散"出彩中國人",則代碼如下:
// 被解散的群組id String grouId = "出彩中國人群組ID"; // 獲得SDK群組創(chuàng)建管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用群組移解散接口,設(shè)置結(jié)果回調(diào) 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、群組中所有成員收到的通知回調(diào)方法代碼如下:
@Override //該通知回調(diào)接口是初始化時(shí)設(shè)置的 "設(shè)置SDK接收消息回調(diào)"—OnChatReceiveListener public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) { if (notice == null) { return; } // 群組被解散 if (notice.getType() ==ECGroupNoticeMessage.ECGroupMessageType.DISMISS) { ECDismissGroupMsg dismissGroupMsg = (ECDismissGroupMsg) notice; // 處理群組被解散通知 // 將群組從本地緩存中刪除并通知UI刷新 } }
// 需要獲取群組成員的群組id String grouId = "出彩中國人群組ID"; // 獲得SDK群組管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用獲取群組成員接口,設(shè)置結(jié)果回調(diào) 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) { // 忽略不處理 } } );
// 創(chuàng)建查詢參數(shù)規(guī)則(按照群組id檢索) ECGroupMatch match = new ECGroupMatch(ECGroupMatch.SearchType.GROUPID); // 設(shè)置檢索詞(根據(jù)匹配規(guī)則輸入群組I的或者名稱) match.setkeywords("出彩的中國人"); // 獲得SDK群組管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用檢索群組接口,設(shè)置結(jié)果回調(diào) groupManager.searchPublicGroups(match, new ECGroupManager.OnSearchPublicGroupsListener() { @Override public void onSearchPublicGroupsComplete(ECError error , List<ECGroup> groups) { if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS && groups != null){ // 檢索群組成功 // 根據(jù)查詢到的群組選擇是否申請加入群組 return; } // 檢索群組取失敗 Log.e("ECSDK_Demo", "search group fail " + ", errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 忽略不需要處理 } });
// 獲得SDK群組創(chuàng)建管理類 ECGroupManager groupManager = ECDevice.getECGroupManager(); // 調(diào)用查詢個(gè)人加入的群組接口,設(shè)置結(jié)果回調(diào) //Target.Group是群組,Target.Discussion是討論組 groupManager.queryOwnGroups(new ECGroupManager.OnQueryOwnGroupsListener() { @Override public void onQueryOwnGroupsComplete(ECError error, List groups){ if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode) { // 請求成功 // 進(jìn)行本地?cái)?shù)據(jù)庫與服務(wù)器數(shù)據(jù)同步 // 刪除不存在或者沒有加入的群組 return ; } // 查詢個(gè)人加入的群組失敗 Log.e("ECSDK_Demo", "query own groups fail " + ", errorCode=" + error.errorCode); } @Override public void onComplete(ECError error) { // 忽略 } });
1、用戶登錄以后,應(yīng)該首先獲取自己的云通訊服務(wù)端的離線條數(shù),具體代碼如下:(參考Demo中的IMChattingHelper.java)
@Override public void onOfflineMessageCount(int count) { // 注冊SDK的參數(shù)需要設(shè)置如下才能收到該回調(diào) // ECInitParams.setOnChatReceiveListener(new OnChatReceiveListener()); // count參數(shù)標(biāo)識(shí)當(dāng)前賬號的離線消息數(shù) }
2、根據(jù)總的離線條數(shù),決定獲取多少條離線消息,具體代碼如下:如下:(參考Demo中的IMChattingHelper.java)
@Override public int onGetOfflineMessage() { // 注冊SDK的參數(shù)需要設(shè)置如下才能收到該回調(diào) // ECInitParams.setOnChatReceiveListener(new OnChatReceiveListener()); // 建議根據(jù)onHistoryMessageCount(int count)設(shè)置接收的離線消息數(shù) // 消息數(shù) 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離線消息拉取完成之后會(huì)通過該接口通知應(yīng)用 // 應(yīng)用可以在此做類似于Loading框的關(guān)閉,Notification通知等等 }
自定義消息通過發(fā)送文本消息接口擴(kuò)展字段來實(shí)現(xiàn),具體說明如下:(參考Demo中的ChattingActivity.java)
try { // 組建一個(gè)待發(fā)送的ECMessage ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT); //設(shè)置消息的屬性:發(fā)出者,接受者,發(fā)送時(shí)間等 msg.setForm("Tony的賬號"); msg.setMsgTime(System.currentTimeMillis()); // 設(shè)置消息接收者 msg.setTo("John的賬號"); msg.setSessionId("John的賬號"); // 設(shè)置消息發(fā)送類型(發(fā)送或者接收) msg.setDirection(ECMessage.Direction.SEND); // 創(chuàng)建一個(gè)文本消息體,并添加到消息對象中 // 文本消息由用戶自定義組裝,接收端按照規(guī)則解析 ECTextMessageBody msgBody = new ECTextMessageBody("Location"); msg.setBody(msgBody); // 設(shè)置自定義消息類型如:(位置) msg.setUserData("msgType://Location"); // 調(diào)用SDK發(fā)送文本接口發(fā)送消息到服務(wù)器 // 參考發(fā)送文本消息 } catch (Exception e) { // 處理發(fā)送異常 Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage()); }
可以通過接口設(shè)置個(gè)人信息,包括昵稱、生日、性別,建議昵稱必須設(shè)置,以便在推送消息的時(shí)候使用,具體代碼如下:
(參考Demo中的SettingPersionInfoActivity.java)
PersonInfo personInfo =new PersonInfo(); // 設(shè)置生日(格式:2015-5-13); personInfo.setBirth("2015-5-13"); // 設(shè)置昵稱 personInfo.setNickName("Tony"); // 設(shè)置性別(男:1 , 女:2) personInfo.setSex("1"); // 設(shè)置備注 personInfo.setSign("你好,我是Tony"); ECDevice.setPersonInfo(personInfo, new ECDevice.OnSetPersonInfoListener() { @Override public void onSetPersonInfoComplete(ECError e, int version) { if (SdkErrorCode.REQUEST_SUCCESS == error.errorCode) { // 個(gè)人信息設(shè)置成功,version最新的個(gè)人信息版本號 // 更新個(gè)人信息到本地?cái)?shù)據(jù)庫,通知UI刷新 return; } Log.e("ECSDK_Demo", "set person info fail " + ", errorCode=" + e.errorCode); } });
獲取個(gè)人信息代碼如下:(參考Demo中的IMChattingHelper.java)
// 調(diào)用查詢個(gè)人信息接口,設(shè)置結(jié)果回調(diào) ECDevice.getPersonInfo(userId, new ECDevice.OnGetPersonInfoListener() { @Override public void onGetPersonInfoComplete(ECError e, PersonInfo p){ if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode) { // 個(gè)人信息獲取成功 // 更新個(gè)人信息到本地?cái)?shù)據(jù)庫,通知UI刷新 return ; } Log.e("ECSDK_Demo", "get person info fail " + ", errorCode=" + e.errorCode); } });
/** * SDK增加設(shè)置免打擾接口 獲取免打擾列表為服務(wù)器rest接口 * @param userId 用戶id * @param enable 免打擾使能 * @param l 免打擾列表 */ ECDevice.setMuteNotification("uid", true, new ECDevice.OnSetDisturbListener() { @Override public void onResult(ECError ecError) { //返回設(shè)置成功錯(cuò)誤碼 } });
文檔更新時(shí)間:2017年12月12日