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日