消息


发送消息

发送文本、语音、图片、位置等消息(单聊/群聊通用)。

发送文本消息

//创建一条文本消息,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 上是不会显示的)

EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);

//支持单聊和群聊,默认单聊,如果是群聊添加下面这行
cmdMsg.setChatType(ChatType.GroupChat)
String action="action1";//action可以自定义
EMCmdMessageBody cmdBody = new EMCmdMessageBody(action);
String toUsername = "test1";//发送给某个人
cmdMsg.setReceipt(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<EMMessage> messages) {
		//收到消息
	}
	
	@Override
	public void onCmdMessageReceived(List<EMMessage> messages) {
		//收到透传消息
	}
	
	@Override
	public void onMessageReadAckReceived(List<EMMessage> messages) {
		//收到已读回执
	}
	
	@Override
	public void onMessageDeliveryAckReceived(List<EMMessage> message) {
		//收到已送达回执
	}
	
	@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<EMMessage> messages = conversation.getAllMessages();
//SDK初始化加载的聊天记录为20条,到顶时需要去DB里获取更多
//获取startMsgId之前的pagesize条消息,此方法获取的messages SDK会自动存入到此会话中,APP中无需再次把获取到的messages添加到会话中
List<EMMessage> messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize);

建议初始化SDK的时候设置成每个会话默认load一条消息,节省加载会话的时间,方法为: options.setNumberOfMessagesLoaded(1);

获取未读消息数量

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();

获取所有会话

Map<String, EMConversation> conversations = EMClient.getInstance().chatManager().getAllConversations();

如果出现偶尔返回的conversations的sizi为0,那很有可能是没有调用EMClient.getInstance().chatManager().loadAllConversations(),或者调用顺序不对,具体用法请参考登录章节。

删除会话及聊天记录

//删除和某个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 下载

下载Demo及SDK

详细文档请参考 Java Doc


下一页:好友管理