差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
start:200androidcleintintegration:50singlechat [2016/12/23 02:53] liulj [发送透传消息] |
start:200androidcleintintegration:50singlechat [2018/12/12 07:17] jk 已恢复为旧版 (2018/11/06 11:35) |
||
---|---|---|---|
行 9: | 行 9: | ||
==== 发送文本消息及表情 ==== | ==== 发送文本消息及表情 ==== | ||
- | <sxh java> | + | <code java> |
//获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此 | //获取到与聊天人的会话对象。参数username为聊天人的userid或者groupid,后文中的username皆是如此 | ||
EMConversation conversation = EMChatManager.getInstance().getConversation(username); | EMConversation conversation = EMChatManager.getInstance().getConversation(username); | ||
行 25: | 行 25: | ||
//发送消息 | //发送消息 | ||
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | ||
- | </sxh> | + | </code> |
==== 发送语音消息 ==== | ==== 发送语音消息 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username); | EMConversation conversation = EMChatManager.getInstance().getConversation(username); | ||
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.VOICE); | EMMessage message = EMMessage.createSendMessage(EMMessage.Type.VOICE); | ||
行 39: | 行 39: | ||
conversation.addMessage(message); | conversation.addMessage(message); | ||
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | ||
- | </sxh> | + | </code> |
==== 发送图片消息 ==== | ==== 发送图片消息 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username); | EMConversation conversation = EMChatManager.getInstance().getConversation(username); | ||
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.IMAGE); | EMMessage message = EMMessage.createSendMessage(EMMessage.Type.IMAGE); | ||
行 56: | 行 56: | ||
conversation.addMessage(message); | conversation.addMessage(message); | ||
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | ||
- | </sxh> | + | </code> |
==== 发送地理位置消息 ==== | ==== 发送地理位置消息 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username); | EMConversation conversation = EMChatManager.getInstance().getConversation(username); | ||
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.LOCATION); | EMMessage message = EMMessage.createSendMessage(EMMessage.Type.LOCATION); | ||
行 70: | 行 70: | ||
conversation.addMessage(message); | conversation.addMessage(message); | ||
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | ||
- | </sxh> | + | </code> |
==== 发送文件消息 ==== | ==== 发送文件消息 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username); | EMConversation conversation = EMChatManager.getInstance().getConversation(username); | ||
// 创建一个文件消息 | // 创建一个文件消息 | ||
行 88: | 行 88: | ||
conversation.addMessage(message); | conversation.addMessage(message); | ||
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | EMChatManager.getInstance().sendMessage(message, new EMCallBack(){}); | ||
- | </sxh> | + | </code> |
==== 发送透传消息 ==== | ==== 发送透传消息 ==== | ||
行 96: | 行 96: | ||
=== 透传消息发送格式 === | === 透传消息发送格式 === | ||
- | <sxh java> | + | <code java> |
EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD); | EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD); | ||
行 109: | 行 109: | ||
cmdMsg.addBody(cmdBody); | cmdMsg.addBody(cmdBody); | ||
EMChatManager.getInstance().sendMessage(cmdMsg, new EMCallBack()); | EMChatManager.getInstance().sendMessage(cmdMsg, new EMCallBack()); | ||
- | </sxh> | + | </code> |
=== CMD 消息广播监听 === | === CMD 消息广播监听 === | ||
- | <sxh java> | + | <code java> |
// 注册一个cmd消息的BroadcastReceiver | // 注册一个cmd消息的BroadcastReceiver | ||
IntentFilter cmdIntentFilter = new IntentFilter(EMChatManager.getInstance().getCmdMessageBroadcastAction()); | IntentFilter cmdIntentFilter = new IntentFilter(EMChatManager.getInstance().getCmdMessageBroadcastAction()); | ||
行 135: | 行 135: | ||
} | } | ||
}; | }; | ||
- | </sxh> | + | </code> |
==== 发送扩展消息 ==== | ==== 发送扩展消息 ==== | ||
当 SDK 提供的消息类型不满足需求时,开发者可以通过扩展自 SDK 提供的文本、语音、图片、位置等消息类型,从而生成自己需要的消息类型。 | 当 SDK 提供的消息类型不满足需求时,开发者可以通过扩展自 SDK 提供的文本、语音、图片、位置等消息类型,从而生成自己需要的消息类型。 | ||
- | <sxh java> | + | <code java> |
//这里是扩展自文本消息,如果这个自定义的消息需要用到语音或者图片等,可以扩展自语音、图片消息,亦或是位置消息。 | //这里是扩展自文本消息,如果这个自定义的消息需要用到语音或者图片等,可以扩展自语音、图片消息,亦或是位置消息。 | ||
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT); | EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT); | ||
行 172: | 行 172: | ||
} | } | ||
} | } | ||
- | </sxh> | + | </code> |
行 181: | 行 181: | ||
注意事项:为了防止新消息来时,因为没有注册广播接收者,导致漏接消息的情况,注册完接受者以及好友监听等事件后,需要调用以下 SDK 才会发送新消息的广播,只需调用一次即可,可参考 Demo 的 mainactivity。 | 注意事项:为了防止新消息来时,因为没有注册广播接收者,导致漏接消息的情况,注册完接受者以及好友监听等事件后,需要调用以下 SDK 才会发送新消息的广播,只需调用一次即可,可参考 Demo 的 mainactivity。 | ||
- | <sxh java>EMChat.getInstance().setAppInited()</sxh> | + | <code java>EMChat.getInstance().setAppInited()</code> |
另外,当 APP 在后台时,SDK 默认以 notification 的形式通知有新消息,不会走广播,如果需要走广播,可以调用以下 SDK 关闭 notification 通知,这样新消息还是走发送广播的形式。 | 另外,当 APP 在后台时,SDK 默认以 notification 的形式通知有新消息,不会走广播,如果需要走广播,可以调用以下 SDK 关闭 notification 通知,这样新消息还是走发送广播的形式。 | ||
- | <sxh java>EMChatManager.getInstance().getChatOptions().setShowNotificationInBackgroud(false)</sxh> | + | <code java>EMChatManager.getInstance().getChatOptions().setShowNotificationInBackgroud(false)</code> |
注册一个相应 broadcast,用来接收消息。 | 注册一个相应 broadcast,用来接收消息。 | ||
- | <sxh java> | + | <code java> |
NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver(); | NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver(); | ||
IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction()); | IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction()); | ||
行 210: | 行 210: | ||
} | } | ||
} | } | ||
- | </sxh> | + | </code> |
==== 通过监听事件来接收新消息 ==== | ==== 通过监听事件来接收新消息 ==== | ||
行 216: | 行 216: | ||
注意事项:注册消息事件监听,此 listener 会收到所有类型的 event 事件,如果对某种或某些类型的事件感兴趣,可以用 registerEventListener(EMEventListener listener, EMNotifierEvent.EventType[] types)。 | 注意事项:注册消息事件监听,此 listener 会收到所有类型的 event 事件,如果对某种或某些类型的事件感兴趣,可以用 registerEventListener(EMEventListener listener, EMNotifierEvent.EventType[] types)。 | ||
- | <sxh java> | + | <code java> |
EMNotifierEvent.Event.EventDeliveryAck;//已发送回执event注册 | EMNotifierEvent.Event.EventDeliveryAck;//已发送回执event注册 | ||
EMNotifierEvent.Event.EventNewCMDMessage;//接收透传event注册 | EMNotifierEvent.Event.EventNewCMDMessage;//接收透传event注册 | ||
行 223: | 行 223: | ||
EMNotifierEvent.Event.EventReadAck;//已读回执event注册 | EMNotifierEvent.Event.EventReadAck;//已读回执event注册 | ||
EMNotifierEvent.Event.EventConversationListChanged;//通知会话列表通知event注册(在某些特殊情况,SDK去删除会话的时候会收到回调监听) | EMNotifierEvent.Event.EventConversationListChanged;//通知会话列表通知event注册(在某些特殊情况,SDK去删除会话的时候会收到回调监听) | ||
- | </sxh> | + | </code> |
接收所有的 event 事件: | 接收所有的 event 事件: | ||
- | <sxh java> | + | <code java> |
EMChatManager.getInstance().registerEventListener(new EMEventListener() { | EMChatManager.getInstance().registerEventListener(new EMEventListener() { | ||
行 237: | 行 237: | ||
} | } | ||
}); | }); | ||
- | </sxh> | + | </code> |
有选择性的接收某些类型 event 事件: | 有选择性的接收某些类型 event 事件: | ||
- | <sxh java> | + | <code java> |
EMChatManager.getInstance().registerEventListener(new EMEventListener() { | EMChatManager.getInstance().registerEventListener(new EMEventListener() { | ||
行 252: | 行 252: | ||
}, new EMNotifierEvent.Event[]{EMNotifierEvent.Event.EventNewMessage,.......} | }, new EMNotifierEvent.Event[]{EMNotifierEvent.Event.EventNewMessage,.......} | ||
); | ); | ||
- | </sxh> | + | </code> |
__**注:广播和监听事件不可同时混用。**__ | __**注:广播和监听事件不可同时混用。**__ | ||
行 260: | 行 260: | ||
如果不想收到回调,则执行解除监听事件。 | 如果不想收到回调,则执行解除监听事件。 | ||
- | <sxh java> | + | <code java> |
EMChatManager.getInstance().unregisterEventListener(new EMEventListener() { | EMChatManager.getInstance().unregisterEventListener(new EMEventListener() { | ||
行 269: | 行 269: | ||
} | } | ||
}); | }); | ||
- | </sxh> | + | </code> |
==== 获取聊天记录 ==== | ==== 获取聊天记录 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | ||
//获取此会话的所有消息 | //获取此会话的所有消息 | ||
行 282: | 行 282: | ||
//如果是群聊,调用下面此方法 | //如果是群聊,调用下面此方法 | ||
List<EMMessage> messages = conversation.loadMoreGroupMsgFromDB(startMsgId, pagesize); | List<EMMessage> messages = conversation.loadMoreGroupMsgFromDB(startMsgId, pagesize); | ||
- | </sxh> | + | </code> |
===== 消息管理(单一聊天人、所有聊天人) ===== | ===== 消息管理(单一聊天人、所有聊天人) ===== | ||
行 288: | 行 288: | ||
==== 获取未读消息数量 ==== | ==== 获取未读消息数量 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | ||
conversation.getUnreadMsgCount(); | conversation.getUnreadMsgCount(); | ||
- | </sxh> | + | </code> |
==== 未读消息数清零 ==== | ==== 未读消息数清零 ==== | ||
行 297: | 行 297: | ||
指定会话消息未读数清零。 | 指定会话消息未读数清零。 | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | ||
conversation.markAllMessagesAsRead(); | conversation.markAllMessagesAsRead(); | ||
- | </sxh> | + | </code> |
==== 所有未读消息数清零 ==== | ==== 所有未读消息数清零 ==== | ||
- | <sxh java> | + | <code java> |
EMChatManager.getInstance().markAllConversationsAsRead(); | EMChatManager.getInstance().markAllConversationsAsRead(); | ||
- | </sxh> | + | </code> |
==== 获取消息总数 ==== | ==== 获取消息总数 ==== | ||
- | <sxh java> | + | <code java> |
EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | ||
conversation.getMsgCount(); | conversation.getMsgCount(); | ||
- | </sxh> | + | </code> |
==== 清空会话聊天记录 ==== | ==== 清空会话聊天记录 ==== | ||
- | <sxh java> | + | <code java> |
//清空和某个user的聊天记录(包括本地),不删除conversation这个会话对象 | //清空和某个user的聊天记录(包括本地),不删除conversation这个会话对象 | ||
EMChatManager.getInstance().clearConversation(username|groupid); | EMChatManager.getInstance().clearConversation(username|groupid); | ||
- | </sxh> | + | </code> |
==== 删除单个聊天记录 ==== | ==== 删除单个聊天记录 ==== | ||
- | <sxh java> | + | <code java> |
//删除和某个user的整个的聊天记录(包括本地) | //删除和某个user的整个的聊天记录(包括本地) | ||
EMChatManager.getInstance().deleteConversation(username|groupid); | EMChatManager.getInstance().deleteConversation(username|groupid); | ||
行 330: | 行 330: | ||
EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | EMConversation conversation = EMChatManager.getInstance().getConversation(username|groupid); | ||
conversation.removeMessage(deleteMsg.msgId); | conversation.removeMessage(deleteMsg.msgId); | ||
- | </sxh> | + | </code> |
==== 删除所有聊天记录 ==== | ==== 删除所有聊天记录 ==== | ||
- | <sxh java> | + | <code java> |
//删除所有会话记录(包括本地) | //删除所有会话记录(包括本地) | ||
EMChatManager.getInstance().deleteAllConversation(); | EMChatManager.getInstance().deleteAllConversation(); | ||
- | </sxh> | + | </code> |
==== 设置某条消息为已读 ==== | ==== 设置某条消息为已读 ==== | ||
- | <sxh java> | + | <code java> |
//markAsRead为true,则标记msgid的消息位已读 | //markAsRead为true,则标记msgid的消息位已读 | ||
conversation.getMessage({msgid},markAsRead); | conversation.getMessage({msgid},markAsRead); | ||
- | </sxh> | + | </code> |
==== 设置自定义的消息提示 ==== | ==== 设置自定义的消息提示 ==== | ||
行 350: | 行 350: | ||
APP 在后台时,新消息会通过 notification 的方式,在手机状态栏提示新消息,可以把提示的内容换成自定义的内容(在application的oncreate()里设置)。 | APP 在后台时,新消息会通过 notification 的方式,在手机状态栏提示新消息,可以把提示的内容换成自定义的内容(在application的oncreate()里设置)。 | ||
- | <sxh java> | + | <code java> |
//获取到配置options对象 | //获取到配置options对象 | ||
EMChatOptions options = EMChatManager.getInstance().getChatOptions(); | EMChatOptions options = EMChatManager.getInstance().getChatOptions(); | ||
行 367: | 行 367: | ||
} | } | ||
}); | }); | ||
- | </sxh> | + | </code> |
设置自定义 notification 点击跳转 intent。 | 设置自定义 notification 点击跳转 intent。 | ||
行 373: | 行 373: | ||
用户点击 notification 消息,SDK 会有默认的跳转 intent,开发者可以设置自己的跳转 intent,这里以 UIdemo 的代码为例。 | 用户点击 notification 消息,SDK 会有默认的跳转 intent,开发者可以设置自己的跳转 intent,这里以 UIdemo 的代码为例。 | ||
- | <sxh java> | + | <code java> |
// 获取到EMChatOptions对象 | // 获取到EMChatOptions对象 | ||
EMChatOptions options = EMChatManager.getInstance().getChatOptions(); | EMChatOptions options = EMChatManager.getInstance().getChatOptions(); | ||
行 394: | 行 394: | ||
} | } | ||
}); | }); | ||
- | </sxh> | + | </code> |
===== 新消息提示 ===== | ===== 新消息提示 ===== | ||
行 402: | 行 402: | ||
首先获取EMChatOptions。 | 首先获取EMChatOptions。 | ||
- | <sxh java>chatOptions = EMChatManager.getInstance().getChatOptions();</sxh> | + | <code java>chatOptions = EMChatManager.getInstance().getChatOptions();</code> |
行 408: | 行 408: | ||
- | <sxh java> | + | <code java> |
- | chatOptions.setNotifyBySoundAndVibrate(true|false); //默认为true 开启新消息提醒</sxh> | + | chatOptions.setNotifyBySoundAndVibrate(true|false); //默认为true 开启新消息提醒</code> |
设置是否启用新消息声音提醒。 | 设置是否启用新消息声音提醒。 | ||
- | <sxh java> | + | <code java> |
- | chatOptions.setNoticeBySound(true|false); //默认为true 开启声音提醒</sxh> | + | chatOptions.setNoticeBySound(true|false); //默认为true 开启声音提醒</code> |
设置是否启用新消息震动提醒。 | 设置是否启用新消息震动提醒。 | ||
- | <sxh java> | + | <code java> |
- | chatOptions.setNoticedByVibrate(true|false); //默认为true 开启震动提醒</sxh> | + | chatOptions.setNoticedByVibrate(true|false); //默认为true 开启震动提醒</code> |
设置语音消息播放是否设置为扬声器播放。 | 设置语音消息播放是否设置为扬声器播放。 | ||
- | <sxh java> | + | <code java> |
- | chatOptions.setUseSpeaker(true|false); //默认为true 开启扬声器播放</sxh> | + | chatOptions.setUseSpeaker(true|false); //默认为true 开启扬声器播放</code> |
设置后台接收新消息时是否通过通知栏提示。 | 设置后台接收新消息时是否通过通知栏提示。 | ||
- | <sxh java> | + | <code java> |
- | chatOptions.setShowNotificationInBackgroud(true|false) //默认为true</sxh> | + | chatOptions.setShowNotificationInBackgroud(true|false) //默认为true</code> |
附: | 附: | ||
- | <sxh java> | + | <code java> |
chatOptions.setAcceptInvitationAlways(false); | chatOptions.setAcceptInvitationAlways(false); | ||
- | //默认添加好友时为true,是不需要验证的,改成需要验证为false</sxh> | + | //默认添加好友时为true,是不需要验证的,改成需要验证为false</code> |
===== 导入消息到环信数据库 ===== | ===== 导入消息到环信数据库 ===== | ||
行 447: | 行 447: | ||
导入消息到环信DB。 | 导入消息到环信DB。 | ||
- | <sxh java> | + | <code java> |
//创建一条发送TextMsg | //创建一条发送TextMsg | ||
private EMMessage createSentTextMsg(String to) { | private EMMessage createSentTextMsg(String to) { | ||
行 479: | 行 479: | ||
//只需要指定msg.setChatType(ChatType.GroupChat) | //只需要指定msg.setChatType(ChatType.GroupChat) | ||
//然后把目标username传入groupid即可 | //然后把目标username传入groupid即可 | ||
- | </sxh> | + | </code> |
===== Demo 及 SDK 下载 ===== | ===== Demo 及 SDK 下载 ===== | ||