====== 消息 ====== ---- ===== 发送消息 ===== 发送文本、语音、图片、位置等消息(单聊/群聊通用)。 ====发送文本消息==== //创建一条文本消息,content为消息文字内容,toChatUsername为对方用户或者群聊的id,后文皆是如此 EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); //如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP) message.setChatType(ChatType.GroupChat); //发送消息 EMClient.getInstance().chatManager().sendMessage(message); ====发送语音消息==== //filePath为语音文件路径,length为录音时间(秒) EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername); //如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP) message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message); ====发送视频消息==== //videoPath为视频本地路径,thumbPath为视频预览图路径,videoLength为视频时间长度 EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername); //如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP) message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message); ====发送图片消息==== //imagePath为图片本地路径,false为不发送原图(默认超过100k的图片会压缩后发给对方),需要发送原图传true EMMessage.createImageSendMessage(imagePath, false, toChatUsername); //如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP) message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message); ====发送地理位置消息==== //latitude为纬度,longitude为经度,locationAddress为具体位置内容 EMMessage message = EMMessage.createLocationSendMessage(latitude, longitude, locationAddress, toChatUsername); //如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP) message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message); ====发送文件消息==== EMMessage message = EMMessage.createFileSendMessage(filePath, toChatUsername); // 如果是群聊,设置chattype,默认是单聊 if (chatType == CHATTYPE_GROUP) message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message); ==== 发送透传消息 ==== 透传消息能做什么:头像、昵称的更新等。可以把透传消息理解为一条指令,通过发送这条指令给对方,告诉对方要做的 action,收到消息可以自定义处理的一种消息。(透传消息不会存入本地数据库中,所以在 UI 上是不会显示的)。另,以“em_”和“easemob::”开头的action为内部保留字段,注意不要使用 EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD); //支持单聊和群聊,默认单聊,如果是群聊添加下面这行 cmdMsg.setChatType(ChatType.GroupChat) String action="action1";//action可以自定义 EMCmdMessageBody cmdBody = new EMCmdMessageBody(action); String toUsername = "test1";//发送给某个人 cmdMsg.setTo(toUsername); cmdMsg.addBody(cmdBody); EMClient.getInstance().chatManager().sendMessage(cmdMsg); ==== 发送扩展消息 ==== 当 SDK 提供的消息类型不满足需求时,开发者可以通过扩展自 SDK 提供的文本、语音、图片、位置等消息类型,从而生成自己需要的消息类型。 这里是扩展自文本消息,如果这个自定义的消息需要用到语音或者图片等,可以扩展自语音、图片消息,亦或是位置消息。 EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); // 增加自己特定的属性 message.setAttribute("attribute1", "value"); message.setAttribute("attribute2", true); ... EMClient.getInstance().chatManager().sendMessage(message); //接收消息的时候获取到扩展属性 //获取自定义的属性,第2个参数为没有此定义的属性时返回的默认值 message.getStringAttribute("attribute1",null); message.getBooleanAttribute("attribute2", false); ... ===== 接收消息 ===== 通过注册消息监听来接收消息。 EMClient.getInstance().chatManager().addMessageListener(msgListener); EMMessageListener msgListener = new EMMessageListener() { @Override public void onMessageReceived(List messages) { //收到消息 } @Override public void onCmdMessageReceived(List messages) { //收到透传消息 } @Override public void onMessageRead(List messages) { //收到已读回执 } @Override public void onMessageDelivered(List message) { //收到已送达回执 } @Override public void onMessageRecalled(List messages) { //消息被撤回 } @Override public void onMessageChanged(EMMessage message, Object change) { //消息状态变动 } }; 记得在不需要的时候移除listener,如在activity的onDestroy()时 EMClient.getInstance().chatManager().removeMessageListener(msgListener); ===== 监听消息状态 ===== 通过 message 设置消息的发送及接收状态。 message.setMessageStatusCallback(new EMCallBack(){}); ===== 获取聊天记录 ===== EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); //获取此会话的所有消息 List messages = conversation.getAllMessages(); //SDK初始化加载的聊天记录为20条,到顶时需要去DB里获取更多 //获取startMsgId之前的pagesize条消息,此方法获取的messages SDK会自动存入到此会话中,APP中无需再次把获取到的messages添加到会话中 List messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize); ===== 获取未读消息数量 ===== EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); conversation.getUnreadMsgCount(); ===== 未读消息数清零 ===== EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); //指定会话消息未读数清零 conversation.markAllMessagesAsRead(); //把一条消息置为已读 conversation.markMessageAsRead(messageId); //所有未读消息数清零 EMClient.getInstance().chatManager().markAllConversationsAsRead(); ===== 获取消息总数 ===== EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); //获取此会话在本地的所有的消息数量 conversation.getAllMsgCount(); //如果只是获取当前在内存的消息数量,调用 conversation.getAllMessages().size(); ===== 消息漫游 ===== 环信sdk 在3.3.4版本增加了一个消息漫游接口,即可以从服务器拉取历史消息到本地,方便用户切换设备同步消息(''此功能属于增值服务,需要联系商务同事开通'') 此方法属于''EMChatManager'' 类,通过''EMClient.getInstance().chatManager()''调用,使用方法参考 Demo 中 ''EaseChatFragment'' 类的 ''loadMoreRoamingMessages()'' 方法 /** * 从服务器获取历史消息 * * @param conversationId 会话名称 * @param type 会话类型 * @param pageSize 获取的页面大小 * @param startMsgId 漫游消息的开始消息id,如果为空,从最新的消息向前开始获取 * @return 返回消息列表和用于继续获取历史消息的Cursor */ public EMCursorResult fetchHistoryMessages(String conversationId, EMConversationType type, int pageSize,String startMsgId); /** * 从服务器获取历史消息 * * @param conversationId 会话名称 * @param type 会话类型 * @param pageSize 获取的页面大小 * @param startMsgId 漫游消息的开始消息id,如果为空,从最新的消息向前开始获取 * @param callBack 返回消息列表和用于继续获取历史消息的Cursor */ public void asyncFetchHistoryMessage(String conversationId, EMConversationType type, int pageSize, String startMsgId, EMValueCallBack> callBack) ===== 撤回消息功能 ===== 消息撤回功能可以撤回一定时间内发送出去的消息,目前只能是两分钟,不能修改。 消息撤回为增值功能。请提供租户id,联系环信商务经理开通。 EMClient.getInstance().chatManager().recallMessage(contextMenuMessage); ===== 分页获取历史消息记录 ===== try { EMClient.getInstance().chatManager().fetchHistoryMessages( toChatUsername, EaseCommonUtils.getConversationType(chatType), pagesize, ""); final List msgs = conversation.getAllMessages(); int msgCount = msgs != null ? msgs.size() : 0; if (msgCount < conversation.getAllMsgCount() && msgCount < pagesize) { String msgId = null; if (msgs != null && msgs.size() > 0) { msgId = msgs.get(0).getMsgId(); } conversation.loadMoreMsgFromDB(msgId, pagesize - msgCount); } messageList.refreshSelectLast(); } catch (HyphenateException e) { e.printStackTrace(); } ===== 获取所有会话 ===== Map conversations = EMClient.getInstance().chatManager().getAllConversations(); 如果出现偶尔返回的conversations的sizi为0,那很有可能是没有调用''EMClient.getInstance().chatManager().loadAllConversations()'',或者调用顺序不对,具体用法请参考[[30androidsdkbasics#登录|登录]]章节。 ===== 删除会话及聊天记录 ===== //删除和某个user会话,如果需要保留聊天记录,传false EMClient.getInstance().chatManager().deleteConversation(username, true); //删除当前会话的某条聊天记录 EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); conversation.removeMessage(deleteMsg.msgId); ===== 导入消息到数据库 ===== EMClient.getInstance().chatManager().importMessages(msgs); ===== Demo 及 SDK 下载 ===== [[http://www.easemob.com/download/im|下载Demo及SDK]] 详细文档请参考 [[http://docs.easemob.com/doku.php?id=im:200androidclientintegration:120androidsdkjavadoc|Java Doc]] ---- 上一页:[[im:200androidclientintegration:30androidsdkbasics|Android SDK 基础功能]] 下一页:[[im:200androidclientintegration:60buddymgmt|好友管理]]