1、单聊

✾ 发送文本\图片\附件—我们假设Tony给John发送文本消息,则代码如下:(参考Demo中IMChattingHelper类和ChattingFragment类)

try {
    // 组建一个待发送的ECMessage
    ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
   //如果需要跨应用发送消息,需通过appkey+英文井号+用户帐号的方式拼接,发送录音、发送群组消息等与此方式一致。
   //例如:appkey=20150314000000110000000000000010 
              帐号ID=john  
              传入帐号=20150314000000110000000000000010#john              
   //msg.setTo(""appkey#John的账号");
    // 设置消息接收者
    msg.setTo("John的账号");

    // 创建一个文本消息体,并添加到消息对象中
    ECTextMessageBody msgBody = new ECTextMessageBody(text.toString());

    // 或者创建一个图片消息体 并且设置附件包体(其实图片也是相当于附件)
    // 比如我们发送SD卡里面的一张Tony_2015.jpg图片
    ECImageMessageBody msgBody  = new ECImageMessageBody();
    // 设置附件名
    msgBody.setFileName("Tony_2015.jpg");
    // 设置附件扩展名
    msgBody.setFileExt("jpg");
    // 设置附件本地路径
    msgBody.setLocalUrl("../Tony_2015.jpg");

    // 或者创建一个创建附件消息体
    // 比如我们发送SD卡里面的一个Tony_2015.zip文件
    ECFileMessageBody msgBody  = new ECFileMessageBody();
    // 设置附件名
    msgBody.setFileName("Tony_2015.zip");
    // 设置附件扩展名
    msgBody.setFileExt(zip);
    // 设置附件本地路径
    msgBody.setLocalUrl("../Tony_2015.zip");
    // 设置附件长度
    msgBody.setLength("Tony_2015.zip文件大小");

    // 将消息体存放到ECMessage中
    msg.setBody(msgBody);
    // 调用SDK发送接口发送消息到服务器
    ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 处理消息发送结果
            if(message == null) {
                return ;
            }
            // 将发送的消息更新到本地数据库并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
            // 处理文件发送上传进度(尽上传文件、图片时候SDK回调该方法)
        }
    });
} catch (Exception e) {
    // 处理发送异常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}

                    

✾ 发送语音

1、我们假设Tony给John发送一条语音,则代码如下:(参考Demo中IMChattingHelper类和ChattingFragment类)

try {
    // 组建一个待发送的ECMessage
    ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE);
    // 设置消息接收者
    message.setTo("John的账号");
    // 扩张字段,应用可以自定义规则
    message.setUserData("msgExt://amr");
    // 设置语音包体,语音录制文件需要保存的目录
    ECVoiceMessageBody messageBody = new ECVoiceMessageBody(new File("保存路径"), 0);
    message.setBody(messageBody);
    // 仅录制语音消息,录制完成后需要调用发送接口发送消息
    ECChatManager manager = ECDevice.getECChatManager();
    manager.startVoiceRecording(message, 
            new ECChatManager.OnRecordTimeoutListener() {

        @Override
        public void onRecordingTimeOut(long duration) {
            // 如果语音录制超过最大60s长度,则发送
            // 同时SDK停止当前语音录制
        }

        @Override
        public void onRecordingAmplitude(
                double amplitude) {
            // 显示声音振幅

        }

    });
    // 调用SDk接口停止当前录音
    manager.stopVoiceRecording(
            new ECChatManager.OnStopVoiceRecordingListener() {
        @Override
        public void onRecordingComplete() {
            // SDK停止录音完成,调用SDK接口发送语音消息
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
//将ECMessage对象传入sendMessage方法进行发送。

                    

2、我们假设Tony给John发送录音变声消息,则代码如下:

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

//根据传入不同的pitch及tempo会引起不同的变声效果、以下的是demo中的效果
if("yuansheng".equals(appendName)){

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

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

//将变音文件组成一个待发送的ECMessage
ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE);
// 设置接收者、发送者、会话ID等信息
message.setForm("Tony的账号");
message.setMsgTime(System.currentTimeMillis());
// 设置消息接收者
message.setTo("John的账号");
message.setSessionId("John的账号");
// 设置消息发送类型(发送或者接收)
message.setDirection(ECMessage.Direction.SEND);
// 扩张字段,应用可以自定义规则
message.setUserData("msgExt://amr");
// 设置语音包体,语音录制文件需要保存的目录
ECVoiceMessageBody messageBody = new ECVoiceMessageBody(file, 0);
message.setBody(messageBody);
//将ECMessage对象传入sendMessage方法进行发送。

                    

✾ 地理位置

//经纬度
ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION);
        // 设置消息接收者
        msg.setTo(mRecipients);
        // 创建一个消息体,并添加到位置消息对象中
        ECLocationMessageBody msgBody = new ECLocationMessageBody("传入lat", "传入lon");
        msgBody.setTitle("位置信息");
        msg.setBody(msgBody);
        
ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 处理消息发送结果
            if(message == null) {
                return ;
            }
            // 将发送的消息更新到本地数据库并刷新UI
        }

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

//将ECMessage对象传入sendMessage方法进行发送

                    

✾ 接收消息—我们假设John收到Tony发送过来的消息,则代码如下:

@Override
//如果是跨应用消息,发送者为appkey+英文井号+用户帐号。
//例如:  appkey=20150314000000110000000000000010 
             帐号ID=john  
             发送者=20150314000000110000000000000010#john  
public void OnReceivedMessage(ECMessage msg) {
	if(msg == null) {
		return ;
	}
	// 接收到的IM消息,根据IM消息类型做不同的处理(IM消息类型:ECMessage.Type)
	ECMessage.Type type = msg.getType();
	if(type == ECMessage.Type.TXT) {
		// 在这里处理文本消息
		ECTextMessageBody textMessageBody = (ECTextMessageBody) msg.getBody();
	} else {

		String thumbnailFileUrl = null;
		String remoteUrl = null;
		if (type == ECMessage.Type.FILE) {
			// 在这里处理附件消息
			ECFileMessageBody fileMsgBody = (ECFileMessageBody) msg.getBody();
			// 获得下载地址
			remoteUrl = fileMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.IMAGE) {
			// 在这里处理图片消息
			ECImageMessageBody imageMsgBody = (ECImageMessageBody) msg.getBody();
			// 获得缩略图地址
			thumbnailFileUrl = imageMsgBody.getThumbnailFileUrl();
			// 获得原图地址
			remoteUrl = imageMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VOICE) {
			// 在这里处理语音消息
			ECVoiceMessageBody voiceMsgBody = (ECVoiceMessageBody) msg.getBody();
			// 获得下载地址
			remoteUrl = voiceMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VIDEO) {
			// 在这里处理视频消息
			ECVideoMessageBody videoMessageBody = (ECVideoMessageBody) msg.getBody();
			// 获得下载地址
			remoteUrl = videoMessageBody.getRemoteUrl();
		} else if (type == ECMessage.Type.LOCATION) {
			// 在这里处理地理位置消息
			ECLocationMessageBody locationMessageBody = (ECLocationMessageBody) msg.getBody();
			// 获得下载地址
			locationMessageBody.getLatitude(); // 纬度信息
			locationMessageBody.getLongitude();// 经度信息
		} else {
			Log.e("ECSDK_Demo" , "Can't handle msgType=" + type.name()
					+ " , then ignore.");
			// 后续还会支持(自定义等消息类型)
		}

		if(TextUtils.isEmpty(remoteUrl)) {
			return ;
		}
		if(!TextUtils.isEmpty(thumbnailFileUrl)) {
			// 先下载缩略图
		} else {
			// 下载附件
		}
	}
	// 根据不同类型处理完消息之后,将消息序列化到本地存储(sqlite)
	// 通知UI有新消息到达

}

                    

✾ 阅后即焚—阅后即焚(暂时只支持单聊)可以参考demo通过ECMessage中的扩展userData字段去实现、当接收方收到发送方发送过来的消息、解析userData字段发现是阅后即焚消息,在查看之后可以调用删除阅后即焚消息、通知服务器删除消息,同时发送方会收到消息被删除的通知。 代码如下:

1、接收方删除阅后即焚消息
ECDevice.getECChatManager().deleteMessage("阅后即焚的消息的ECMessage对象", new OnDeleteMessageListener() {
  public void onDeleteMessage(ECError paramECError, ECMessage paramECMessage) {
     //处理删除阅后即焚消息的回调、获取删除消息的结果响应
  }
});

2、发送方收到接收方删除阅后即焚消息的通知
(通过实现OnChatReceiveListener中的 onReceiveMessageNotify方法可以获取到消息被删除的通知)
public void onReceiveMessageNotify(ECMessageNotify msg) {
  if(msg.getNotifyType()==NotifyType.DELETE){  //通过if判断代表当前类型是删除阅后即焚的通知
     ECMessageDeleteNotify deleteMsg=(ECMessageDeleteNotify) msg;
     //处理接收方删除阅后即焚消息的通知、比如删除本地图片等
   }
}

                    

✾ 发送富文本消息—代码如下:

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

	
 // 创建一个富文本消息体 
 ECPreviewMessageBody msgBody = new ECPreviewMessageBody(); //富文本消息body
 //title标题、设置富文本消息的标题
 msgBody.setTitle(title); 
 //desc设置大概的描述信息 
 msgBody.setDescContent(desc);
 //设置解析网页获取的图片的本地地址(apps需要将获取的图片保存到手机上)、sdk需要将图片进行上传。
 msgBody.setLocalUrl(xxx.jpg);
 //url设置富文本消息对应的网页的url、当对方点击时打开的网页网址
 msgBody.setUrl(url); 
 //解析网页图片的url地址、设置当前富文本消息的一张图片、解析网页获取该图片的过程由开发者实现、
 //也可以参考demo使用jsoup或其他实现。
 msgBody.setRemoteUrl(imgUrl); 
 //将msgBody设置给该富文本消息
 msg.setBody(msgBody); 
 //获取消息发送者管理
ECChatManager manager = ECDevice.getECChatManager();
//发送富文本消息
 manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 处理消息发送结果
            if(message == null) {
                return ;
            }
            // 将发送的消息更新到本地数据库并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
            // 处理文件发送上传进度
        }
    });
} catch (Exception e) {
    // 处理发送异常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}

                    

✾ 发送状态消息—代码如下:

        // 组建一个待发送的ECMessage
        ECMessage msg = ECMessage.createECMessage(ECMessage.Type.STATE);
        
        msg.setTo(mRecipients); // 设置消息接收者
        // 创建一个状态消息体,并添加到消息对象中
        ECUserStateMessageBody msgBody = new ECUserStateMessageBody(state);//state当前聊天过程中的输入状态
        msg.setBody(msgBody);
	ECChatManager ecChatManager = ECDevice.getECChatManager(); //获取发送消息管理者
	if(ecChatManager==null){
			return;
	}
	ecChatManager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {//发送状态消息
			@Override
			public void onSendMessageComplete(ECError error, ECMessage message) {

			}

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

			}
	});

                    

✾ 撤回消息(仅支持发送成功后、在2分钟之内进行撤回处理)—代码如下:

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

✾ 把消息置为已读—代码如下:

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

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

            Log.d(“置为已读成功"); 
			} 
		 } 
		}
);

                    

✾ 设置会话置顶—代码如下:

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

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

✾ 获取置顶会话列表—代码如下:

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

✾ 取消发送消息(仅支持voiceBody、videoBody、fileBody、imageBody、preViewBody消息body、取消的回调结果在onSendMessageComplete回调中返回171259错误码)—代码如下:

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

                    

2、群聊

✾ 发送文本\语音\图片\附件—我们假设Tony给群组名为"出彩中国人"的群组发送消息,群聊与点对点唯一的区别在于
群聊的接收者账号为群组ID,则代码如下:(参考Demo中IMChattingHelper类和ChattingFragment类)

try {
    // 组建一个待发送的ECMessage
    ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
    //设置消息的属性:发出者,接受者,发送时间等
    msg.setForm("Tony的账号");
    msg.setMsgTime(System.currentTimeMillis());
    // 设置消息接收者
    msg.setTo("出彩的中国人群组ID");
    msg.setSessionId("出彩的中国人群组ID ");
    // 设置消息发送类型(发送或者接收)
    msg.setDirection(ECMessage.Direction.SEND);
    // 创建一个文本消息体,并添加到消息对象中
    ECTextMessageBody msgBody = new ECTextMessageBody("来自Tony的消息");
    msg.setBody(msgBody);

// 图片、文件、语音可以参考点对点消息体创建
    // 调用SDK发送接口发送消息到服务器
    ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 处理消息发送结果
            if(message == null) {
                return ;
            }
            // 将发送的消息更新到本地数据库并刷新UI
        }

        @Override
        public void onProgress(String msgId, int totalByte, int progressByte) {
            // 处理文件发送上传进度(尽上传文件、图片时候SDK回调该方法)
        }

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


                    

✾ 发送变声消息 — 我们假设Tony给群组名为"出彩中国人"的群组发送录音变声消息,则代码如下:

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

//根据传入不同的pitch及tempo会引起不同的变声效果、以下的是demo中的效果
if("yuansheng".equals(appendName)){

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

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

//将变音文件组成一个待发送的ECMessage
ECMessage message = ECMessage.createECMessage(ECMessage.Type.VOICE);
// 设置接收者、发送者、会话ID等信息
message.setForm("Tony的账号");
message.setMsgTime(System.currentTimeMillis());
// 设置消息接收者
msg.setTo("出彩的中国人群组ID");
msg.setSessionId("出彩的中国人群组ID ");
// 设置消息发送类型(发送或者接收)
message.setDirection(ECMessage.Direction.SEND);
// 扩张字段,应用可以自定义规则
message.setUserData("msgExt://amr");
// 设置语音包体,语音录制文件需要保存的目录
ECVoiceMessageBody messageBody = new ECVoiceMessageBody(file, 0);
message.setBody(messageBody);
//将ECMessage对象传入sendMessage方法进行发送。

                    

✾ 地理位置

说明:关于发送地理位置,该功能需要用户自己在客户端通过发送消息的接口实现,SDK中没有封装具体的发送位置接口(android、ios均需用户自己在客户端实现)。

ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION);
        // 设置消息接收者
        msg.setTo(mRecipients);
        // 创建一个消息体,并添加到位置消息对象中
        ECLocationMessageBody msgBody = new ECLocationMessageBody("传入lat", "传入lon");
        msgBody.setTitle("位置信息");
        msg.setBody(msgBody);
        
ECChatManager manager = ECDevice.getECChatManager();
    manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
        @Override
        public void onSendMessageComplete(ECError error, ECMessage message) {
            // 处理消息发送结果
            if(message == null) {
                return ;
            }
            // 将发送的消息更新到本地数据库并刷新UI
        }

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

//将ECMessage对象传入sendMessage方法进行发送

                    

✾ 接收消息—我们假设John是"出彩中国人"群组中的一员,则代码如下:

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

		String thumbnailFileUrl = null;
		String remoteUrl = null;
		if (type == ECMessage.Type.FILE) {
			// 在这里处理附件消息
			ECFileMessageBody fileMsgBody = (ECFileMessageBody) msg.getBody();
			// 获得下载地址
			remoteUrl = fileMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.IMAGE) {
			// 在这里处理图片消息
			ECImageMessageBody imageMsgBody = (ECImageMessageBody) msg.getBody();
			// 获得缩略图地址
			thumbnailFileUrl = imageMsgBody.getThumbnailFileUrl();
			// 获得原图地址
			remoteUrl = imageMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VOICE) {
			// 在这里处理语音消息
			ECVoiceMessageBody voiceMsgBody = (ECVoiceMessageBody) msg.getBody();
			// 获得下载地址
			remoteUrl = voiceMsgBody.getRemoteUrl();
		} else if (type == ECMessage.Type.VIDEO) {
			// 在这里处理语音消息
			ECVideoMessageBody videoMessageBody = (ECVideoMessageBody) msg.getBody();
			// 获得下载地址
			remoteUrl = videoMessageBody.getRemoteUrl();
		} else if (type == ECMessage.Type.LOCATION) {
			// 在这里处理地理位置消息
			ECLocationMessageBody locationMessageBody = (ECLocationMessageBody) msg.getBody();
			// 获得下载地址
			locationMessageBody.getLatitude(); // 纬度信息
			locationMessageBody.getLongitude();// 经度信息
		} else {
			Log.e("ECSDK_Demo" , "Can't handle msgType=" + type.name()
					+ " , then ignore.");
			// 后续还会支持(自定义等消息类型)
		}

		if(TextUtils.isEmpty(remoteUrl)) {
			return ;
		}
		if(!TextUtils.isEmpty(thumbnailFileUrl)) {
			// 先下载缩略图
		} else {
			// 下载附件
		}
	}
	// 根据不同类型处理完消息之后,将消息序列化到本地存储(sqlite)
	// 通知UI有新消息到达

}

                    

3、群组操作

✾ 创建群组/讨论组—我们假设Tony要创建一个名为"出彩中国人",具体代码如下:

// 构建群组参数
ECGroup group = new ECGroup();
// 设置群组名称
group.setName("出彩中国人");
// 设置群组公告
group.setDeclare("欢迎体验云通讯群组功能");
// 设置群组类型,如:ECGroup.Scope.TEMP临时群组(100人)
group.setScope(ECGroup.Scope.TEMP);;
// 设置群组验证权限,如:需要身份验证ECGroup.Permission.NEED_AUTH
group.setPermission(ECGroup.Permission.NEED_AUTH);
// 设置群组创建者(可以不设置,服务器默认接口调用者为创建者)
group.setOwner("Tony的账号");
//false代表是群组、true代表是讨论组
group.setIsdiscuss(false);//是否是讨论组
// 获得SDK群组创建管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用创建群组接口,设置创建结果回调
groupManager.createGroup(group, new ECGroupManager.OnCreatGroupListener() {
    @Override
    public void onCreatGroupComplete(ECError error, ECGroup group) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
            // 群组/讨论组创建成功
            // 缓存创建的群组/讨论组到数据库,同时通知UI进行更新
            return ;
        }
        // 群组/讨论组创建失败
        Log.e("ECSDK_Demo" , "create group fail , errorCode=" 
+ error.errorCode);
    }

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

                    

✾ 主动加入—只要知道群组id,就可以主动加入群组。

1、我们假设"出彩中国人"群组已经有Tony和John两位成员,现在Smith要加入"出彩中国人"群组,则代码如下:

// 申请加入的群组id
String groupId = "出彩中国人群组ID";
// 设置申请加入理由
String declare = "Smith申请加入群组";
// 获得SDK群组管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用审请加入群组接口,设置结果回调
groupManager.joinGroup(groupId, declare
        , new ECGroupManager.OnJoinGroupListener() {
    @Override
    public void onJoinGroupComplete(ECError error, String groupId) {
        if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode)
                || SdkErrorCode.MEMBER_ALREADY_EXIST == error.errorCode)) {
            // 申请加入群组成功(SdkErrorCode.MEMBER_ALREADY_EXIST代表
申请者已经是群组成员)
            // 根据申请的群组权限(permission字段)来区分
            // 是否直接加入成功或者需要管理员审核
            if(permission == 1) {
                // 群组申请不需要验证,直接加入
                // 这里可以跳转到群组聊天界面、更新UI
                return;
            }
            Toast.makeText(Context , "申请加入群组成功,请等待管理员审核" ,
                    Toast.LENGTH_SHORT).show();
            return ;
        }
        // 群组申请失败
        Log.e("ECSDK_Demo", "join group fail , errorCode="
                + error.errorCode);

    }

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


                    

注意:如果群组"出彩中国人"是公开群组,则smith直接被允许加入。如果群组"出彩中国人"是私有群组
则smith加入需要群主Tony的的同意。

关于几种群组的解释:
公开群组:用户可以直接被允许加入群组,不需要群主进行验证;
验证群组:用户加入群组的时候需要群主同意才可以加入
私有群组:只能群主邀请加入

Tony首先收到mith加入的请求,代码如下:

@Override
//该通知回调接口是初始化时设置的 
"设置SDK接收消息回调"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }
    // 有人申请加入群组(仅限于管理员)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.PROPOSE) {
        ECProposerMsg proposerMsg = (ECProposerMsg) notice;
        // 处理申请加入群组请求通知
    }

}


                    

Tony同意Smith加入的请求,代码如下:

// 创建回复验证参数响应状态
// ECAckType.AGREE:通过 ECAckType.REJECT:拒绝
ECAckType ackType = ECAckType.AGREE;
// 所属的群组ID
String groupId = "出彩中国人群组ID";
// 申请者账号ECProposerMsg.getProposer()
String proposer = "Smith的账号";
// 获得SDK群组管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用验证申请群组接口,设置结果回调
groupManager.ackJoinGroupRequest(groupId, proposer, ackType ,
        new ECGroupManager.OnAckJoinGroupRequestListener() {
            @Override
            public void onAckJoinGroupRequestComplete(ECError error
                    , String groupId, String member) {
                if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
                    // 回复群组申请成功
                    return ;
                }
                // 回复群组申失败
                Log.e("ECSDK_Demo", "ack group apply fail , errorCode="
                        + error.errorCode);

            }

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

2、Smith加入成功后,群组中成员Tony和John收到的通知回调方法代码如下:(参考Demo中的IMChattingHelper.java)

@Override
//该通知回调接口是初始化时设置的 
"设置SDK接收消息回调"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }
    // 有人加入群组通知(群组成员)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.JOIN) {
        ECJoinGroupMsg joinGroupMsg = (ECJoinGroupMsg) notice;
        // 处理某人加入群组通知
    }
} 

                    

✾ 邀请加入—只能群主邀请别人加入

1、我们假设"出彩中国人"群组的创建者Tony邀请Smith加入群组,则代码如下:(参考Demo中的CreateGroupActivity.java)

// 设置群组ID
String groupId = "出彩中国人群组ID";
// 设置邀请加入理由
String declare = "Tony邀请Smith加入群组";
// 设置邀请加入的群组成员(可多选)
String[] members = new String[]{"Smith的账号"};
// 是否需要对方确认(NEED_CONFIRM 需要对方验证,FORCE_PULL 不需要对方验证)
ECGroupManager.InvitationMode confirm = ECGroupManager.InvitationMode.NEED_CONFIRM;
// 获得SDK群组管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用邀请加入群组接口,设置结果回调
groupManager.inviteJoinGroup(groupId , declare ,members , confim
        ,new ECGroupManager.OnInviteJoinGroupListener() {
    @Override
    public void onComplete(ECError error) {
        // 可以忽略不需要处理
    }

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

    }
});
                    

注意:如果Tony邀请Smith加入的时候,接口参数不指定加入需要Smith确认,则smith直接被邀请加入。如果指定需要Smith
同意才能加入,则Smith收到如下通知回调,并在回调里面回复"同意"或"拒绝"加入。代码如下:

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

    // 有人加入群组通知(群组成员)
    if (notice.getType() == ECGroupNoticeMessage.ECGroupMessageType.INVITE) {
        ECInviterMsg inviterMsg = (ECInviterMsg) notice;
        // 处理群组管理员邀请加入群组通知
        String groupId = inviterMsg.getGroupId();
    }
} 

// 创建回复验证参数响应状态
// ECAckType.AGREE:通过 ECAckType.REJECT:拒绝
ECAckType ackType = ECAckType.AGREE;
// 所属的群组ID
String groupId = "出彩中国人群组ID";
// 邀请者账号(ECInviterMsg.getAdmin())
String inviter = "Tony的账号";
// 获得SDK群组创建管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用回复邀请加入群组接口,设置结果回调
groupManager.ackInviteJoinGroupRequest(groupId, ackType,inviter,
        new ECGroupManager.OnAckInviteJoinGroupRequestListener() {
            @Override
            public void onAckInviteJoinGroupRequestComplete(ECError error , 
                                                            String groupId) {
                if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
                    // 回复群组邀请成功
                    return;
                }
                // 回复群组邀请失败
                Log.e("ECSDK_Demo", "ack group apply fail , errorCode="
                        + error.errorCode);

            }

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

                    

2、Smith加入成功后,群组中成员Tony和John收到的通知回调方法代码如下:(参考Demo中的IMChattingHelper.java)

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

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

✾ 退出群组

1、我们假设Smith要退出群组,则代码如下:

// 设置需要退出的群组id
String groupId = "出彩中国人群组ID";
// 获得SDK群组创建管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用退出群组接口,设置结果回调
groupManager.quitGroup(groupId, new ECGroupManager.OnQuitGroupListener() {
    @Override
    public void onQuitGroupComplete(ECError error, String groupId) {
        if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
            // 退出群组成功
            // 这里可以删除本地群组缓存,删除群组聊天纪录等
            return;
        }
        // 退出群组失败
        Log.e("ECSDK_Demo", "quit group fail , errorCode="
                + error.errorCode);
    }
    @Override
    public void onComplete(ECError error) {
        // 忽略
    }
});
                    

2、Smith退出成功后,群组中成员Tony和John收到的通知回调方法代码如下:(参考Demo中的IMChattingHelper.java)

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

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

✾ 群主踢人

1、我们假设群主Tony要把Smith要踢出群组,则代码如下:

// Smith所在的群组id
String grouId = "出彩中国人群组ID";
// Smith账号
String member = "Smith的账号";
// 获得SDK群组创建管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用群组移除成员接口,设置结果回调
groupManager.deleteGroupMember(grouId, member,
        new ECGroupManager.OnDeleteGroupMembersListener() {
    @Override
    public void onDeleteGroupMembersComplete(ECError error
            , String groupId, String members) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS){
            // 移除成员成功
            // 将Smith账号从本地群组关联关系中移除
            // 通知UI更新
            return;
        }
        // 退出群组失败
        Log.e("ECSDK_Demo", "remove group member fail " +
                ", errorCode=" + error.errorCode);

    }

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

2、群组中所有成员都会收到的Smith被踢的消息,包括Smith自己,Smith判断被踢用户的id等于自己,
则从本地删除群组,此通知回调方法代码如下:(参考Demo中的IMChattingHelper.java)

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

    // 有人被移除出群组
    if (notice.getType() == 
            ECGroupNoticeMessage.ECGroupMessageType.REMOVE_MEMBER) {
        ECRemoveMemberMsg removeMemberMsg = (ECRemoveMemberMsg) notice;
        // 处理群组移除成员通知
        if ("Smith账号".equals(removeMemberMsg.getMember())) {
            // 如果是自己则将从本地群组关联关系中移除
            // 通知UI处理刷新
        }

    }
}
                    

✾ 解散群组—只有群主才能解散群组。

1、我们假设群主Tony要解散"出彩中国人",则代码如下:

// 被解散的群组id
String grouId = "出彩中国人群组ID";
// 获得SDK群组创建管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用群组移解散接口,设置结果回调
groupManager.deleteGroup(groupId, new ECGroupManager.OnDeleteGroupListener() {
    @Override
    public void onDeleteGroupComplete(ECError error, String groupId) {
        if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS){
            // 群组解散成功
            // 将群组信息从本地缓存中删除 通知UI更新
            return;
        }
        // 解散群组失败
        Log.e("ECSDK_Demo", "del group fail " +
                ", errorCode=" + error.errorCode);

    }

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


                    

2、群组中所有成员收到的通知回调方法代码如下:

@Override
//该通知回调接口是初始化时设置的 
"设置SDK接收消息回调"—OnChatReceiveListener
public void OnReceiveGroupNoticeMessage(ECGroupNoticeMessage notice) {
    if (notice == null) {
        return;
    }
    // 群组被解散
    if (notice.getType() ==ECGroupNoticeMessage.ECGroupMessageType.DISMISS) {
        ECDismissGroupMsg dismissGroupMsg = (ECDismissGroupMsg) notice;
        // 处理群组被解散通知
        // 将群组从本地缓存中删除并通知UI刷新
    }
}
                    

✾ 获取群成员—代码如下:(参考Demo中的GroupMemberService.java)

// 需要获取群组成员的群组id
String grouId = "出彩中国人群组ID";
// 获得SDK群组管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用获取群组成员接口,设置结果回调
groupManager.queryGroupMembers(groupId,
        new ECGroupManager.OnQueryGroupMembersListener() {
            @Override
            public void onQueryGroupMembersComplete(ECError error
                    , List<ECGroupMember> members) {
                if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS 
&& members != null) {
                    // 获取群组成员成功
                    // 将群组成员信息更新到本地缓存中(sqlite) 通知UI更新
                    return;
                }
                // 群组成员获取失败
                Log.e("ECSDK_Demo", "sync group detail fail " +
                        ", errorCode=" + error.errorCode);

            }

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


                    

✾ 群组搜索—可以根据群组名字或者群组ID来搜索群组(群组名称为纯数字或纯字母时需要输入完整的群名称) ,代码如下。 (参考Demo中的SearchGroupActivity.java)

// 创建查询参数规则(按照群组id检索)
ECGroupMatch match = new ECGroupMatch(ECGroupMatch.SearchType.GROUPID);
// 设置检索词(根据匹配规则输入群组I的或者名称)
match.setkeywords("出彩的中国人");
// 获得SDK群组管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用检索群组接口,设置结果回调
groupManager.searchPublicGroups(match, 
        new ECGroupManager.OnSearchPublicGroupsListener() {
    @Override
    public void onSearchPublicGroupsComplete(ECError error
            , List<ECGroup> groups) {
        if (error.errorCode == SdkErrorCode.REQUEST_SUCCESS && groups != null){
            // 检索群组成功
            // 根据查询到的群组选择是否申请加入群组
            return;
        }
        // 检索群组取失败
        Log.e("ECSDK_Demo", "search group fail " +
                ", errorCode=" + error.errorCode);

    }

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


                    

✾ 获取个人所在的群组—用户登录后,通常首先调取此接口获取自己所在群组/讨论组,此接口会返回群组的
id、名称、免打扰状态等信息,其示例代码如下:

// 获得SDK群组创建管理类
ECGroupManager groupManager = ECDevice.getECGroupManager();
// 调用查询个人加入的群组接口,设置结果回调
//Target.Group是群组,Target.Discussion是讨论组
groupManager.queryOwnGroups(new ECGroupManager.OnQueryOwnGroupsListener() {
    @Override
    public void onQueryOwnGroupsComplete(ECError error, List groups){
        if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode) {
            // 请求成功
            // 进行本地数据库与服务器数据同步
            // 删除不存在或者没有加入的群组
            return ;
        }

        // 查询个人加入的群组失败
        Log.e("ECSDK_Demo", "query own groups fail " +
                ", errorCode=" + error.errorCode);

    }

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

                    

4、离线消息

1、用户登录以后,应该首先获取自己的云通讯服务端的离线条数,具体代码如下:(参考Demo中的IMChattingHelper.java)

@Override
public void onOfflineMessageCount(int count) {
    // 注册SDK的参数需要设置如下才能收到该回调
    // ECInitParams.setOnChatReceiveListener(new OnChatReceiveListener());
    // count参数标识当前账号的离线消息数
}


                    

2、根据总的离线条数,决定获取多少条离线消息,具体代码如下:如下:(参考Demo中的IMChattingHelper.java)

@Override
public int onGetOfflineMessage() {
    // 注册SDK的参数需要设置如下才能收到该回调
    // ECInitParams.setOnChatReceiveListener(new OnChatReceiveListener());
    // 建议根据onHistoryMessageCount(int count)设置接收的离线消息数
// 消息数 ECDevice.SYNC_OFFLINE_MSG_ALL:全部获取 0:不获取
    return count;
} 


                    

3、客户端处理 SDk拉取的离线消息

@Override
public void onReceiveOfflineMessage(List<ECMessage> msgs) {
    // 离线消息的处理可以参考 void OnReceivedMessage(ECMessage msg)方法
    // 处理逻辑完全一样
    // 参考 IMChattingHelper.java
}


                    

4、客户端处理离线消息拉取完成通知

@Override
public void onReceiveOfflineMessageCompletion() {
    // SDK离线消息拉取完成之后会通过该接口通知应用
    // 应用可以在此做类似于Loading框的关闭,Notification通知等等
}

                    

5、自定义消息

自定义消息通过发送文本消息接口扩展字段来实现,具体说明如下:(参考Demo中的ChattingActivity.java)



try {
    // 组建一个待发送的ECMessage
    ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
    //设置消息的属性:发出者,接受者,发送时间等
    msg.setForm("Tony的账号");
    msg.setMsgTime(System.currentTimeMillis());
    // 设置消息接收者
    msg.setTo("John的账号");
    msg.setSessionId("John的账号");
    // 设置消息发送类型(发送或者接收)
    msg.setDirection(ECMessage.Direction.SEND);
    // 创建一个文本消息体,并添加到消息对象中
    // 文本消息由用户自定义组装,接收端按照规则解析
    ECTextMessageBody msgBody = new ECTextMessageBody("Location");
    msg.setBody(msgBody);
    
    // 设置自定义消息类型如:(位置)
    msg.setUserData("msgType://Location");
    // 调用SDK发送文本接口发送消息到服务器
    // 参考发送文本消息
} catch (Exception e) {
    // 处理发送异常
    Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());
}
                    

6、设置个人信息

可以通过接口设置个人信息,包括昵称、生日、性别,建议昵称必须设置,以便在推送消息的时候使用,具体代码如下:
(参考Demo中的SettingPersionInfoActivity.java)

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

7、获取个人信息

获取个人信息代码如下:(参考Demo中的IMChattingHelper.java)

// 调用查询个人信息接口,设置结果回调
ECDevice.getPersonInfo(userId, new ECDevice.OnGetPersonInfoListener() {
   @Override
   public void onGetPersonInfoComplete(ECError e, PersonInfo p){
        if(SdkErrorCode.REQUEST_SUCCESS == error.errorCode) {
            // 个人信息获取成功
            // 更新个人信息到本地数据库,通知UI刷新
            return ;
        }
        Log.e("ECSDK_Demo", "get person info fail  " +
                ", errorCode=" + e.errorCode);
    }
});
                    

8、设置免打扰

    /**
     * SDK增加设置免打扰接口 获取免打扰列表为服务器rest接口
     * @param userId    用户id
     * @param enable    免打扰使能
     * @param l         免打扰列表
     */
    ECDevice.setMuteNotification("uid", true, new ECDevice.OnSetDisturbListener() {
            @Override
            public void onResult(ECError ecError) {
                //返回设置成功错误码
            }
        });
                    

文档更新时间:2017年12月12日