1.RongDatabaseDao 融云缓存数据库操作类
1.1融云SDK 本地数据库表
数据库 | 名称 |
---|---|
用户 | users |
群 | groups |
群用户 | group-users |
讨论组 | discussions |
1.2数据库操作类
class RongDatabaseDao {
private static final String TAG = "RongDatabaseDao";
private RongUserCacheDatabaseHelper rongUserCacheDatabaseHelper;
private SQLiteDatabase db;
private final String usersTable = "users";
private final String groupUsersTable = "group_users";
private final String groupsTable = "groups";
private final String discussionsTable = "discussions";
1.3 消息接收处理
拦截融云发送的消息类型,然后根据类型,是否处理该消息。
- 系统消息
- 好友添加通知
- 新消息通知
- Push信息
- IM 已默认处理的信息方式
RongIM.setOnReceiveMessageListener
2.Token 重连
//融云连接监听事件
RongIM.setConnectionStatusListener
//融云Token 连接
RongIM.connect
//RongIMClient 主要类
RongIM.setConnectionStatusListener(new RongIMClient.ConnectionStatusListener() {
@Override
public void onChanged(ConnectionStatus status) {
if (status == ConnectionStatus.TOKEN_INCORRECT) {
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
final String cacheToken = sp.getString("loginToken", "");
if (!TextUtils.isEmpty(cacheToken)) {
RongIM.connect(cacheToken, SealAppContext.getInstance().getConnectCallback());
} else {
Log.e("seal", "token is empty, can not reconnect");
}
}
}
});
RongIM.connect(token, new RongIMClient.ConnectCallback() {
@Override
public void onTokenIncorrect() {
}
@Override
public void onSuccess(String s) {
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
RongIMClient.ConnectionStatusListener
public interface ConnectionStatusListener {
void onChanged(RongIMClient.ConnectionStatusListener.ConnectionStatus var1);
public static enum ConnectionStatus {
NETWORK_UNAVAILABLE(-1, "Network is unavailable."),
CONNECTED(0, "Connect Success."),
CONNECTING(1, "Connecting"),
DISCONNECTED(2, "Disconnected"),
KICKED_OFFLINE_BY_OTHER_CLIENT(3, "Login on the other device, and be kicked offline."),
TOKEN_INCORRECT(4, "Token incorrect."),
SERVER_INVALID(5, "Server invalid."),
CONN_USER_BLOCKED(6, "User blocked by admin");
private int code;
private String msg;
private ConnectionStatus(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getValue() {
return this.code;
}
public String getMessage() {
return this.msg;
}
}
}
3.用户信息和群消息
1.设置当前用户
RongContext.getInstance().setCurrentUserInfo(userInfo);
2.更新好友信息
RongIM.getInstance().refreshUserInfoCache(userInfo);
3.更新群信息
RongIM.getInstance().refreshGroupInfoCache(groupInfo);
4.监听事件
/**
* init 后就能设置的监听
*/
private void initListener() {
RongIM.setConversationBehaviorListener(this);//设置会话界面操作的监听器。
RongIM.setConversationListBehaviorListener(this);
RongIM.setConnectionStatusListener(this);
//用户信息提供者
RongIM.setUserInfoProvider(this, true);
//群消息提供者
RongIM.setGroupInfoProvider(this, true);
//设置地理位置提供者,不用位置的同学可以注掉此行代码
RongIM.setLocationProvider(this);
setInputProvider();
//setUserInfoEngineListener();//移到SealUserInfoManager
setReadReceiptConversationType();
RongIM.getInstance().enableNewComingMessageIcon(true);
RongIM.getInstance().enableUnreadMessageIcon(true);
RongIM.getInstance().setGroupMembersProvider(this);
//群成员提供者
//RongIM.setGroupUserInfoProvider(this, true);//seal app暂时未使用这种方式,目前使用UserInfoProvider
BroadcastManager.getInstance(mContext).addAction(SealConst.EXIT, new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
quit(false);
}
});
setMessageItemLongClickAction(mContext);
}
5.主动获取群消息
if (mConversationType.equals(Conversation.ConversationType.GROUP)) {
getMemberList();//群时,后去用户列表
}
//缓存到 用户自定义数据库表中
SealUserInfoManager.getInstance().addAppGroupMembers(data, mTargetId);
6.群成员ids 提供给融云
//CallKit start 2
RongCallKit.setGroupMemberProvider(new RongCallKit.GroupMembersProvider() {
@Override
public ArrayList<String> getMemberList(String groupId, final RongCallKit.OnGroupMembersResult result) {
mCallMemberResult = result;
getGroupMembersForCall();
if (menberIds != null) {
mCallMemberResult.onGotMemberList(menberIds);
}
List<GroupMember> groupMembers = SealUserInfoManager.getInstance().getGroupMembers(groupId);
ArrayList<String> Ids=new ArrayList<>();
if (groupMembers != null) {
for (GroupMember item:groupMembers){
Ids.add(item.getUserId());
}
}
return Ids;
}
});
4.给陌生人发送消息
- 消息体 带有用户信息
//设置当前用户信息
RongIM.getInstance().setCurrentUserInfo(UserInfo userInfo)
//设置消息体 允许携带当前用户信息
RongIM.getInstance().setMessageAttachedUserInfo(true)
问题: setMessageAttachedUserInfo(true) 和 setUserInfoProvider最好不要同时使用,
RongIM.getInstance().setMessageAttachedUserInfo(true)
//如果设置消息可携带用户消息,当携带的用户信息为空时,不会再回调
RongIM.setUserInfoProvider(this, true);// 用户信息提供者
导致会话列表UI 上不能正确显示 用户头像和昵称