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()); }
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方法進行發送。
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方法進行發送
@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有新消息到達 }
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) { } });
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,”獲取失敗"); } } });
ECChatManager chatManager =ECDevice.getECChatManager(); if(chatManager ==null){ return; } chatManager.cancelSendMessage(message);
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()); }
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方法進行發送
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有新消息到達 }
// 構建群組參數 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) { // 不需要處理忽略 } });
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刷新 } }
// 需要獲取群組成員的群組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檢索) 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) { // 忽略不需要處理 } });
// 獲得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) { // 忽略 } });
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通知等等 }
自定義消息通過發送文本消息接口擴展字段來實現,具體說明如下:(參考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()); }
可以通過接口設置個人信息,包括昵稱、生日、性別,建議昵稱必須設置,以便在推送消息的時候使用,具體代碼如下:
(參考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); } });
獲取個人信息代碼如下:(參考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); } });
/** * 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日