消息收发

单聊指的是一对一的收发消息。云通讯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有新消息到达
  • }