集成融云直播聊天室(官方集成以及自我总结)

来源:互联网 发布:mt4软件使用说明 编辑:程序博客网 时间:2024/06/12 16:24

近期做直播,当然,直播当然就要做到聊天室,聊天室选择的是融云聊天直播室

首先 官方集成 如下:


IMLib SDK 集成说明

  1. 下载 IMLib SDK:点击下载

  2. SDK 目录结构说明:

  3. libs 目录 - native so 库,目前支持 armeabi(含 v7 及 64 位),以及 x86 平台。如有其它平台需求,请联系客服。

  4. res 目录- 配置及资源文件。
  5. build.gradle - gradle 配置相关,可再此定义编译版本等信息。
  6. AndroidManifest.xml - SDK 配置文件,可查看 SDK 所需的安卓权限等信息。

  7. 导入 IMLib SDK:

  8. 将下载的 IMLib 文件夹拷贝到工程根目录,为方便使用可更名为 imlib。

  9. 在 settings.gradle 里加入 imlib 库引用,如:

      include ':app', ':imlib'
  10. 在主工程 build.gradle 文件的 dependencies 中加入 imlib 库引用,如:

      compile project(':imlib')

至此 IMLib SDK 集成完毕,可在主工程里直接调用其接口。

IMLib SDK 使用说明

  1. SDK 初始化:

    在使用 IMLib 接口前,需要对其做初始化操作,只需调一次即可。建议在继承 Application 类的 onCreate 方法中调用。 接口说明如下:

     /** * @param context 传入 Application 类的 Context。 * @param appKey  融云注册应用的 AppKey。 */ public static void init(Context context, String appKey);
  2. 注册消息监听:

    在连接融云服务器前,需要先注册消息接收监听。这里需要注意,如果在连接之后才注册监听,可能会有消息遗漏的情况。可以使用如下接口注册:

     /** * 设置接收消息事件的监听器。所有接收到的消息、通知、状态都经由此处设置的监听器处理。包括私聊消息、讨论组消息、群组消息、聊天室消息以及各种状态。 * 注意:如果调用此接口的 Activity 被释放回收,将无法收到事件回调。 * * @param listener 接收消息的监听器。 */ public static void setOnReceiveMessageListener(final OnReceiveMessageListener listener);
  3. 获取 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 进行测试。

  4. 登录连接:

    当成功得到 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 请根据错误码进行检查。
  5. 加入聊天室:

    登录成功后,当用户点击房间进入直播聊天室需要调用如下接口,打开消息通道:

     /** * 加入聊天室。如果聊天室不存在,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。

  6. 发送消息:

     /** * 发送消息。 * * @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);
  7. 用户信息显示:

    用户信息由 UserInfo 类来承载,包含用户 id、昵称、头像三部分。聊天室由于用户流动性大,建议将用户信息写入发送的消息体中。调用 MessageContent 的接口:

     /** * 将用户信息写入消息体内 * * @param info 要写入的用户信息。 */ public void setUserInfo(UserInfo info);

    当收到信息后,通过调用 getUserInfo,得到 UserInfo 类,进而得到发送者的信息。

     /** * 获取消息体内的用户信息。 */ public UserInfo getUserInfo()
  8. 退出聊天室:

    当用户退出房间,需要调用如下接口:

     /** * 退出聊天室。 * * @param chatroomId 聊天室 Id。 * @param callback   状态回调。 */ public void quitChatRoom(final String chatroomId, final OperationCallback callback);
  9. 断开连接:

    通常直播聊天室应用,退出后不需要接受离线消息。调用下面接口即可:

     /** * 断开与融云服务器的连接,并且不再接收 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里面,才能在我们的页面里面显示出来~

效果图


0 0