融云IM整理(2)API
消息管理部分
与融云断链后 接收消息的广播
自定义广播接收器
当您的应用处于后台运行或者和融云服务器 disconnect() 的时候,如果收到消息,融云 SDK 会以通知形式提醒您。所以您还需要自定义一个继承融云 PushMessageReceiver 的广播接收器,用来接收提醒通知。示例代码如图:
public class SealNotificationReceiver extends PushMessageReceiver {
@Override
public boolean onNotificationMessageArrived(Context context, PushNotificationMessage message) {
return false; // 返回 false, 会弹出融云 SDK 默认通知; 返回 true, 融云 SDK 不会弹通知, 通知需要由您自定义。
}
@Override
public boolean onNotificationMessageClicked(Context context, PushNotificationMessage message) {
return false; // 返回 false, 会走融云 SDK 默认处理逻辑, 即点击该通知会打开会话列表或会话界面; 返回 true, 则由您自定义处理逻辑。
}
}
插入消息 —— 可用于 (客服自动回复,红包领取提示 :XXX领取了你的红包)
insertMessage()
public void insertMessage(final Conversation.ConversationType type, final
String targetId, final String senderUserId, final MessageContent content, final
long sentTime, final ResultCallback<Message> resultCallback
删除消息
clearMessages()
/**
* 清空指定类型,targetId 的某一会话所有聊天消息记录。
* @param conversationType 会话类型。不支持传入 ConversationType.CHATROOM。
* @param targetId 目标 Id。根据不同的 conversationType,可能是用户 Id、群组 Id。
* @param callback 清空是否成功的回调。
*/
public void clearMessages(final Conversation.ConversationType conversationType, final String targetId, final ResultCallback<Boolean> callback)
获取历史消息 (复写了很多的方法 处理各种场景)
getHistoryMessages()
- 获取某会话的本地历史消息记录,此接口可以通过指定最后一条消息和拉取条数来分段加载历史消息
2.获取某一会话中特定类型消息的本地历史记录,比如可以通过此接口拉取会话中某一条消息之前的 10 条图片消息。
3.获取会话中某条消息之前或者之后的 N 条特定类型消息的本地历史记录。比如,可以获取 messageId 为 22 的这条消息之前或者之后的 10 条图片消息。
4.获取会话中指定消息之前 N 条 和之后 M 条的本地历史消息。
搜索消息
搜索符合消息的 会话列表
searchConversations()
搜索某个会话中 符合条件的消息
searchMessages()
监听接收所有消息
setOnReceiveMessageListener
public static void setOnReceiveMessageListener(final OnReceiveMessageListener listener)
更改 消息 未读已读状态
clearMessagesUnreadStatus()
1.将会话中某个时间之前的消息由未读状态改为已读状态。
2.将某个会话中的所有消息设为已读。
3.根据 messageId 设置消息的各种状态,比如已读,已收听,已下载等。
实例:
// 更新内存中消息的已读状态
message.getReceivedStatus().setRead();
// 更新数据库中消息的状态
RongIMClient.getInstance().setMessageReceivedStatus(message.getMessageId(), message.getReceivedStatus(), null);
会话管理部分
获取会话
获取某个指定会话
根据类型和targeID
getConversation()
获取用户的所有本地会话列表 (私聊,群组,系统会话)
getConversationList( ResultCallback<List> callback )
获取某几种会话类型的会话列表
getConversationList(final ResultCallback<List> callback, final Conversation.ConversationType… conversationTypes)
分页拉取 本地会话列表
getConversationListByPage()
删除会话
removeConversation()
会话提醒状态 (提醒,或者免打扰)
enum ConversationNotificationStatus {
DO_NOT_DISTURB(0), // 会话免打扰状态
NOTIFY(1); // 会话提醒状态
}
setConversationNotificationStatus() //设置会话状态
getConversationNotificationStatus() //获取会话状态
会话草稿管理 (只在本地)
saveTextMessageDraft() //保存草稿
getTextMessageDraft() //过去草稿
会话置顶
setConversationToTop()
获取所有会话 未读消息总数
getTotalUnreadCount(final ResultCallback callback)
获取指定的某一条会话的未读消息数
getUnreadCount(final Conversation.ConversationType conversationType, final String targetId, final ResultCallback callback)
获取某几个会话 未读消息
getTotalUnreadCount(final ResultCallback callback, final Conversation… conversations)
获取一种 或 几种类型的会话未读消息数
getUnreadCount(final ResultCallback callback, final Conversation.ConversationType… conversationTypes)
黑名单
添加到黑名单
addToBlacklist()
从黑名单中移除
removeFromBlacklist()
查询用户是否在黑名单中
getBlacklistStatus()
/**
* 是否在黑名单中状态。
*/
public enum BlacklistStatus {
/**
* 在黑名单中。
*/
IN_BLACK_LIST(0),
/**
* 不在黑名单中。
*/
NOT_IN_BLACK_LIST(1);
}
获取黑名单列表
getBlacklist()
消息体内 携带用户信息(以便快捷的实现用户信息)
String targetId = "1111";
TextMessage textMessage = TextMessage.obtain("test");
//设置用户信息方法一: 只在文本消息内设置携带的用户信息。其它类型的消息也可以用同样的方法单独设置。
textMessage.setUserInfo(getCurrentUserInfo());
// 构造 Message 对象
Message message = Message.obtain(targetId, Conversation.ConversationType.PRIVATE, textMessage);
// 设置用户信息方法二: 通过调用 MessageContent 的 setUserInfo() 方法, 设置所有类型的消息都携带用户信息。
message.getContent().setUserInfo(getCurrentUserInfo());
// 发送消息
RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
}
});
高级功能
消息撤回
recallMessage(final Message message, final RongIMClient.ResultCallback callback)
消息阅读回执
发送消息阅读回执
sendReadReceiptMessage() //单聊时发送回执
sendReadReceiptRequest() //群组时发送回执
接收消息监听
/**
* 设置消息回执监听器
* @param listener 消息回执监听器
*/
RongIMClient.setReadReceiptListener(new RongIMClient.ReadReceiptListener() {
@Override
public void onReadReceiptReceived(final Message message) {
/* if (mConversation != null && mConversation.getTargetId().equals(message.getTargetId()) && mConversation.getConversationType() == message.getConversationType()) {
ReadReceiptMessage content = (ReadReceiptMessage) message.getContent();
//获取发送时间戳
long ntfTime = content.getLastMessageSendTime();
//自行进行UI处理,把会话中发送时间戳之前的所有已发送消息状态置为已读 */
//可以做 单聊时 修改成已读等 操作。
}
@Override
public void onMessageReceiptRequest(Conversation.ConversationType type, String targetId, String messageUId) {
//可以做 群聊时 的单聊已读效果
}
@Override
public void onMessageReceiptResponse(Conversation.ConversationType type, String targetId, String messageUId, HashMap<String, Long> respondUserIdList) {
//可以做 群聊时 比如:企微 查看有谁看过我发的消息了这样的效果。
}
});
多端同步阅读状态
场景:电脑 、手机同时登陆,电脑上阅读完了,手机上的未读数也要清除。
/**
* 同步阅读状态监听
* 多端登录,收到其它端清除某一会话未读数通知的时候,回调 onSyncMessageReadStatus
*/
public interface SyncConversationReadStatusListener {
void onSyncConversationReadStatus(Conversation.ConversationType type, String targetId);
}
RongIMClient.getInstance().setSyncConversationReadStatusListener(new RongIMClient.SyncConversationReadStatusListener() {
@Override
public void onSyncConversationReadStatus(Conversation.ConversationType type, String targetId) {
//重新获取会话的未读数,并且显示到界面上
}
});
输入状态提醒 (如:正在输入、正在讲话、正在拍摄等)
发送状态 (6秒钟只会 发送一次)
RongIMClient.getInstance().sendTypingStatus(mCurrentConversation.getConversationType(),
mCurrentConversation.getTargetId(), objectName);
监听
RongIMClient.setTypingStatusListener(new RongIMClient.TypingStatusListener() {
@Override
public void onTypingStatusChanged(Conversation.ConversationType type, String targetId, Collection<TypingStatus> typingStatusSet) {
//当输入状态的会话类型和targetID与当前会话一致时,才需要显示
if (type.equals(mConversationType) && targetId.equals(mTargetId)) {
//count表示当前会话中正在输入的用户数量,目前只支持单聊,所以判断大于0就可以给予显示了
int count = typingStatusSet.size();
if (count > 0) {
Iterator iterator = typingStatusSet.iterator();
TypingStatus status = (TypingStatus) iterator.next();
String objectName = status.getTypingContentType();
MessageTag textTag = TextMessage.class.getAnnotation(MessageTag.class);
MessageTag voiceTag = VoiceMessage.class.getAnnotation(MessageTag.class);
//匹配对方正在输入的是文本消息还是语音消息
if (objectName.equals(textTag.value())) {
//显示“对方正在输入”
mHandler.sendEmptyMessage(SET_TEXT_TYPING_TITLE);
} else if (objectName.equals(voiceTag.value())) {
//显示"对方正在讲话"
mHandler.sendEmptyMessage(SET_VOICE_TYPING_TITLE);
}
} else {
//当前会话没有用户正在输入,标题栏仍显示原来标题
mHandler.sendEmptyMessage(SET_TARGETID_TITLE);
}
}
}
});
PS: 关于创建关系得 功能,实现都是在后台。