近期做直播,当然,直播当然就要做到聊天室,聊天室选择的是融云聊天直播室
首先 官方集成 如下:
IMLib SDK 集成说明
-
下载 IMLib SDK:点击下载
-
SDK 目录结构说明:
-
libs 目录 - native so 库,目前支持 armeabi(含 v7 及 64 位),以及 x86 平台。如有其它平台需求,请联系客服。
- res 目录- 配置及资源文件。
- build.gradle - gradle 配置相关,可再此定义编译版本等信息。
-
AndroidManifest.xml - SDK 配置文件,可查看 SDK 所需的安卓权限等信息。
-
导入 IMLib SDK:
-
将下载的 IMLib 文件夹拷贝到工程根目录,为方便使用可更名为 imlib。
-
在 settings.gradle 里加入 imlib 库引用,如:
include ':app', ':imlib'
-
在主工程 build.gradle 文件的 dependencies 中加入 imlib 库引用,如:
compile project(':imlib')
至此 IMLib SDK 集成完毕,可在主工程里直接调用其接口。
IMLib SDK 使用说明
-
SDK 初始化:
在使用 IMLib 接口前,需要对其做初始化操作,只需调一次即可。建议在继承 Application 类的 onCreate 方法中调用。 接口说明如下:
/** * @param context 传入 Application 类的 Context。 * @param appKey 融云注册应用的 AppKey。 */ public static void init(Context context, String appKey);
-
注册消息监听:
在连接融云服务器前,需要先注册消息接收监听。这里需要注意,如果在连接之后才注册监听,可能会有消息遗漏的情况。可以使用如下接口注册:
/** * 设置接收消息事件的监听器。所有接收到的消息、通知、状态都经由此处设置的监听器处理。包括私聊消息、讨论组消息、群组消息、聊天室消息以及各种状态。 * 注意:如果调用此接口的 Activity 被释放回收,将无法收到事件回调。 * * @param listener 接收消息的监听器。 */ public static void setOnReceiveMessageListener(final OnReceiveMessageListener listener);
-
获取 Token:
Token 即用户令牌,相当于您 APP 上当前用户连接融云的身份凭证。
在您连接融云服务器之前,您需要请求您的 App Server,您的 App Server 通过 Server API 获取 Token 并返回给您的客户端,客户端获取到这个 Token 即可进入下一步连接融云服务器。
为什么必须在服务器端请求 Token,客户端不提供获取 Token 的接口?
因为获取 Token 时需要提供 App Key 和 App Secret 。如果在客户端请求 Token,假如您的 App 代码一旦被反编译,则会导致您的 App Key 和 App Secret 泄露。所以,务必在您的服务器端获取 Token。
我们在开发者控制台提供了 API 调试的功能,在开发初期阶段,您可以通过其中获取 Token 功能,手动获取 Token 进行测试。
-
登录连接:
当成功得到 Token 后,可以调用 connect 接口与融云服务器进行连接。
/** * 连接服务器,在整个应用程序全局,只需要调用一次,需在 init 之后调用。 * 如果调用此接口遇到连接失败,SDK 会自动启动重连机制进行最多 10 次重连,分别是 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 秒后。 * 在这之后如果仍没有连接成功,还会在当检测到设备网络状态变化时再次进行重连。 * * @param token 从服务端获取的用户身份令牌(Token)。 * @param callback 连接回调。 * @return RongIMClient IM 客户端核心类的实例。 */ public static RongIMClient connect(final String token, final ConnectCallback callback);
当回调 onSuccess 代表连接成功;若回调 onTokenIncorrect 很可能是 Token 跟 AppKey 不匹配,可以去`官网-我的应用-运营工具-用户管理`中检查确认;若返回 onError 请根据错误码进行检查。
-
加入聊天室:
登录成功后,当用户点击房间进入直播聊天室需要调用如下接口,打开消息通道:
/** * 加入聊天室。如果聊天室不存在,sdk 会创建聊天室并加入,如果已存在,则直接加入。加入聊天室时,可以选择拉取聊天室消息数目。 * * @param chatroomId 聊天室 Id。 * @param defMessageCount 进入聊天室拉取消息数目,-1 时不拉取任何消息,0 时拉取 10 条消息,最多只能拉取 50 条。 * @param callback 状态回调。 */ public void joinChatRoom(final String chatroomId, final int defMessageCount, final OperationCallback callback);
或:
/** * 加入已存在的聊天室。如果聊天室不存在,则加入失败。加入聊天室时,可以选择拉取聊天室消息数目。 * * @param chatroomId 聊天室 Id。 * @param defMessageCount 进入聊天室拉取消息数目,-1 时不拉取任何消息,0 时拉取 10 条消息,最多只能拉取 50 条。 * @param callback 状态回调。 */ public void joinExistChatRoom(final String chatroomId, final int defMessageCount, final OperationCallback callback);
如果聊天室不存在则返回错误码 23410,若人数超限则返回错误码 23411。
-
发送消息:
/** * 发送消息。 * * @param message 将要发送的消息体。 * @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。聊天室消息一般不需要推送,可设置为 null。 * @param pushData push 附加信息。聊天室消息一般不需要推送,可设置为 null。 * @param callback 发送消息的回调,参考 IRongCallback.ISendMessageCallback。 */ public void sendMessage(final Message message, final String pushContent, final String pushData, final IRongCallback.ISendMessageCallback callback);
-
用户信息显示:
用户信息由 UserInfo 类来承载,包含用户 id、昵称、头像三部分。聊天室由于用户流动性大,建议将用户信息写入发送的消息体中。调用 MessageContent 的接口:
/** * 将用户信息写入消息体内 * * @param info 要写入的用户信息。 */ public void setUserInfo(UserInfo info);
当收到信息后,通过调用 getUserInfo,得到 UserInfo 类,进而得到发送者的信息。
/** * 获取消息体内的用户信息。 */ public UserInfo getUserInfo()
-
退出聊天室:
当用户退出房间,需要调用如下接口:
/** * 退出聊天室。 * * @param chatroomId 聊天室 Id。 * @param callback 状态回调。 */ public void quitChatRoom(final String chatroomId, final OperationCallback callback);
-
断开连接:
通常直播聊天室应用,退出后不需要接受离线消息。调用下面接口即可:
/** * 断开与融云服务器的连接,并且不再接收 Push 消息。 * 若想断开连接后仍然接受 Push 消息,可以调用 disconnect() */ public void disconnect();
下面是集成当中遇到的问题:
首先创立连接:我们需要把返回的ID保存下来
public void onSuccess(final String userid) { RongIMClient.getInstance().joinChatRoom("1", 5, new RongIMClient.OperationCallback() { @Override public void onSuccess() { Log.d("聊天室进入", "聊天室进入"); id = userid; } @Override public void onError(RongIMClient.ErrorCode errorCode) { Log.d("聊天室进入", "聊天室进入" + errorCode); } }); Log.d("LoginActivity", "--onSuccess---" + userid); }
之后,保存下来,我们需要在发送消息的时候用到,这个时候我们需要给我们发的消息设置昵称或者其他
设置这边我们会遇到一些问题
final TextMessage content = TextMessage.obtain(chattext.getText().toString()); userInfos = new UserInfo(id, "超级奥特曼", null); content.setUserInfo(userInfos); final io.rong.imlib.model.Message msg = io.rong.imlib.model.Message.obtain("1", Conversation.ConversationType.CHATROOM, content); RongIMClient.getInstance().sendMessage(msg, null, null, new RongIMClient.SendMessageCallback() { @Override public void onSuccess(Integer integer) { Log.d("", "发送成功:" + chattext.getText().toString()); } @Override public void onError(Integer integer, RongIMClient.ErrorCode errorCode) { Log.d("", "发送了失败" + errorCode); } }, new RongIMClient.ResultCallback<io.rong.imlib.model.Message>() { @Override public void onSuccess(io.rong.imlib.model.Message message) { Log.d("", "发送成功2:" + chattext.getText().toString()); popupWindowchat.dismiss(); userinfo.add(userInfos); content_list.add(chattext.getText().toString().trim()); chattext.setText(null); android.os.Message s = new android.os.Message(); s.what = 1; myHandler.sendMessage(s); } @Override public void onError(RongIMClient.ErrorCode e) { Log.d("", "发送了失败" + e); popupWindowchat.dismiss(); } }); // }这里面可能大家遇到头疼的就是设置名字了 ,研究了两个钟,才设置好,实在太菜了~
下面我们就是要做接收~
/** * 收到消息的处理。 * * @param message 收到的消息实体。 * @param left 剩余未拉取消息数目。 * @return */ @Override public boolean onReceived(io.rong.imlib.model.Message message, int left) { //开发者根据自己需求自行处理 // Toast.makeText(MainActivity.this,"消息"+message,Toast.LENGTH_LONG).show(); // 此处输出判断是否是文字消息,并输出,其他消息同理。 if (message.getContent() instanceof TextMessage) { final TextMessage textMessage = (TextMessage) message.getContent(); Log.d("onReceived", "接收到的消息: " + textMessage.getContent() + textMessage.getUserInfo().getName()); content_list.add(textMessage.getContent()); userinfo.add(textMessage.getUserInfo()); android.os.Message s = new android.os.Message(); s.what = 1; myHandler.sendMessage(s); }注意如何解析消息
另外,我们自己发的消息自己是不能收到的,必须手动加到list里面,才能在我们的页面里面显示出来~
效果图