消息收发
单聊指的是一对一的收发消息。云通讯SDK支持一对一发送文本消息、图片消息、文件消息、位置消息、富文本消息。代码示例详细介绍如下,参考Demo中IMChattingHelper类和ChattingFragment类)。
API介绍
1、ECMessage是消息基类,ECMessageBody是抽象的消息内容类,可查看Android消息类结构。
参考类:ECMessage查看API
2、发送消息。
- java.lang.String sendMessage(ECMessage message,
- ECChatManager.OnSendMessageListener l)
- 发送IM消息
- 参数:message - 待发送的IM消息l - 发送结果回调
参考类:ECChatManager查看API
发送文本
代码示例
- try{
- //创建一个待发送的消息ECmessage消息体
- ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
- //设置消息接收者,如果是发送群组消息,则接收者设置群组ID
- msg.setTo("John的账号")
- //创建一个文本消息体,并添加到消息对象中
- ECTextMessageBody msgBody = new ECTextMessageBody(text.toString());
- //将消息体存放到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 msg = ECMessage.createECMessage(ECMessage.Type.IMAGE);
- //或者创建一个图片消息体 并且设置附件包体(其实图片也是相当于附件)比如我们发送SD卡里面的一张Tony_2015.jpg图片。
- ECImageMessageBody msgBody = new ECImageMessageBody();
- //设置附件名
- msgBody.setFileName("Tony_2015.jpg");
- // 设置附件扩展名
- msgBody.setFileExt("jpg");
- //设置附件本地路径
- msgBody.setLocalUrl("../Tony_2015.jpg");
- //设置消息接收者,如果是发送群组消息,则接收者设置群组ID
- msg.setTo("John的账号")
- //将消息体存放到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());}
发送附件
代码示例
- //创建一个待发送的消息ECmessage消息体
- ECMessage msg = ECMessage.createECMessage(ECMessage.Type.FILE);
- //或者创建一个创建附件消息体,比如我们发送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文件大小");
- //设置消息接收者,如果是发送群组消息,则接收者设置群组ID
- msg.setTo("John的账号")
- //将消息体存放到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 msg= ECMessage.createECMessage(ECMessage.Type.VOICE);
- // 设置消息接收者,如果是发群组消息,则接收者设置群组ID
- msg.setTo("John的账号");
- // 扩张字段,应用可以自定义规则
- msg.setUserData("msgExt://amr");
- // 设置语音包体,语音录制文件需要保存的目录
- ECVoiceMessageBody messageBody = new ECVoiceMessageBody(new File("保存路径"), 0);
- msg.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接口发送语音消息
- ECChatManager manager = ECDevice.getECChatManager();
- manager.sendMessage(msg, new ECChatManager.OnSendMessageListener() {
- @Override
- public void onSendMessageComplete(ECError error, ECMessage message) {
- // 处理消息发送结果
- if(message == null) {
- return ;
- }
- // 将发送的消息更新到本地数据库并刷新UI
- }
- }
- });} catch (Exception e) {
- e.printStackTrace();}
- //将ECMessage对象传入sendMessage方法进行发送。
发送地理位置
代码示例
- try{
- //组建一个待发送的ECMessage
- ECMessage msg = ECMessage.createECMessage(ECMessage.Type.LOCATION);
- //设置消息接收者,如果是发送群组消息,则接收者设置群组ID
- msg.setTo(mRecipients);
- // 创建一个消息体,并添加到位置消息对象中
- ECLocationMessageBody msgBody = new ECLocationMessageBody("传入lat", "传入lon");
- //title标题
- msgBody.setTitle("位置信息");
- //将消息体存放到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) {
- }
- });} catch (Exception e) {
- // 处理发送异常
- Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());}
发送富文本消息
代码示例
- try{
- //创建一个待发送的消息ECmessage消息体
- ECMessage msg = ECMessage.createECMessage(ECMessage.Type.RICH_TEXT);
- //设置消息接收者,如果是发送群组消息,则接收者设置群组ID
- msg.setTo("john的账号");
- // 创建一个富文本消息体
- ECPreviewMessageBody msgBody = new ECPreviewMessageBody();
- //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);
- //调用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) {
- // 处理文件发送上传进度
- }
- });} catch (Exception e) {
- // 处理发送异常
- Log.e("ECSDK_Demo", "send message fail , e=" + e.getMessage());}
发送状态消息
- //组建一个待发送的ECMessage
- ECMessage msg = ECMessage.createECMessage(ECMessage.Type.STATE);
- //设置消息接收者
- msg.setTo("john的账号");
- //创建一个状态消息体,并添加到消息对象中
- //state当前聊天过程中的输入状态
- ECUserStateMessageBody msgBody = new ECUserStateMessageBody(state);
- //将消息体存放到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());}
自定义消息
自定义消息通过发送文本消息接口扩展字段来实现,通过userData字段来设置自定义消息。
代码示例
- try {
- // 组建一个待发送的ECMessage
- ECMessage msg = ECMessage.createECMessage(ECMessage.Type.TXT);
- // 设置消息接收者
- msg.setTo("John的账号");
- // 创建一个文本消息体,并添加到消息对象中
- // 文本消息由用户自定义组装,接收端按照规则解析
- ECTextMessageBody msgBody = new ECTextMessageBody("Location");
- msg.setBody(msgBody);
- // 设置自定义消息类型如:(位置)
- msg.setUserData("msgType://Location");
- //调用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());}
取消发送消息
仅支持voiceBody、videoBody、fileBody、imageBody、preViewBody消息body、取消的回调onSendMessageComplete回调中返回171259错误码)。
代码示例
- ECChatManager chatManager =ECDevice.getECChatManager();
- if(chatManager ==null){
- return;}
- //取消发送消息
- chatManager.cancelSendMessage(message);
接收消息
接收到的IM消息,根据IM消息类型做不同的处理,接收消息的回调要在初始化成功的方法里面设置。参考文档:IM接收消息监听。
代码示例
- //如果是跨应用消息,发送者为appkey+英文井号+用户帐号。
- //例如:appkey=20150314000000110000000000000010 帐号ID=john
- //发送者=20150314000000110000000000000010#john
- @Override
- 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有新消息到达
- }