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日