IM SDK使用

官方集成文档地址点击打开链接  ,我使用的是IM SDK V2.X版本,所以集成步骤会按照该版本进行,与IMSDK V3.x会有一些细微的差别。

步骤一、注册云通信,创建并配置应用。

IM SDK使用_第1张图片

配置可选择独立模式接入和托管模式接入。配置的流程和使用流程大致相同,所以建议初学只是想摸清楚流程的可以选择对接托管模式。


步骤二、下载SDK文件,将so文件和jar包按照腾讯云直播~上的流程添加依赖。


步骤三、配置manifest文件

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

在AndroidManifest.xml的中添加以下配置:


<service
    android:name="com.tencent.qalsdk.service.QalService"
    android:exported="false" 
    android:process=":QALSERVICE" >  
service> 

<service  
    android:name="com.tencent.qalsdk.service.QalAssistService"  
    android:exported="false"
    android:process=":QALSERVICE" >
 service> 

<receiver
    android:name="com.tencent.qalsdk.QALBroadcastReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="com.tencent.qalsdk.broadcast.qal" />
    intent-filter>
receiver>

<receiver 
    android:name="com.tencent.qalsdk.core.NetConnInfoCenter"  android:process=":QALSERVICE">  
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    intent-filter>
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.TIME_SET" />
    intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.TIMEZONE_CHANGED" />
    intent-filter>
receiver>

步骤四、程序入口处初始化SDK

private void initSDK() {
        //禁止服务器自动代替上报已读
        //TIMManager.getInstance().disableAutoReport();
        //初始化imsdk
        TIMManager.getInstance().init(getApplicationContext());
        //初始化群设置
        TIMManager.getInstance().initGroupSettings(new TIMGroupSettings());
        //注册sig失效监听回调
        TIMManager.getInstance().setUserStatusListener(new TIMUserStatusListener() {
            @Override
            public void onForceOffline() {//被踢下线
            }

            @Override
            public void onUserSigExpired() {//票据过期,需要换票后重新登录
            }
        });
        //登陆设置初始化
        TCLoginMgr.getInstance().init(getApplicationContext());
    }
 /**
     * 初始化TLS SDK
     *
     * @param context applicationContext
     */
    public void init(Context context) {

        //初始化TLS SDK登录模块
        loginHelper = TLSLoginHelper.getInstance().init(context, TCConstants.IMSDK_APPID, TCConstants.IMSDK_ACCOUNT, "1.0");
        loginHelper.setTimeOut(8000);
        loginHelper.setLocalId(2052);
        loginHelper.setTestHost("", true);
        //初始化TLS SDK注册模块
        accountHelper = TLSAccountHelper.getInstance().init(context, TCConstants.IMSDK_APPID, TCConstants.IMSDK_ACCOUNT, "1.0");
        accountHelper.setCountry(Integer.parseInt("86"));
        accountHelper.setTimeOut(8000);
        accountHelper.setLocalId(2052);
        accountHelper.setTestHost("", true);

        // 调用该接口可以判断当前访客登录状态,返回null说明暂时无访客登录,否则返回访客标识
        //String guest = loginHelper.getGuestIdentifier()
    }

步骤五、托管模式登陆。其实独立模式登陆和托管模式登陆区别并不大,独立模式有自己的账户体系要配合后台验证登陆密钥,具体流程可关注云通信官网。至此登陆的完整流程就已经走完了。

 /**
     * 访客登陆
     */
    public void guestLogin() {
        loginHelper.TLSGuestLogin(new TLSGuestLoginListener() {
            @Override
            public void OnGuestLoginSuccess(TLSUserInfo userInfo) {
                TCConstants.USER_ID = userInfo.identifier;
                imLogin(userInfo.identifier, getUserSig(userInfo.identifier));
            }

            @Override
            public void OnGuestLoginFail(TLSErrInfo errInfo) {
                if (null != mTCLoginCallback)
                    mTCLoginCallback.onFailure(errInfo.ErrCode, errInfo.Msg);
            }

            @Override
            public void OnGuestLoginTimeout(TLSErrInfo errInfo) {
                if (null != mTCLoginCallback)
                    mTCLoginCallback.onFailure(errInfo.ErrCode, errInfo.Msg);
            }
        });
    }

/**
     * 获取用户签名
     *
     * @param identifier 用户id
     * @return 用户签名
     */
    public String getUserSig(String identifier) {
        return loginHelper.getUserSig(identifier);
    }

/**
     * imsdk登录接口,与tls登录验证成功后调用
     * @param identify 用户id
     * @param userSig  用户签名(托管模式下由TLSSDK生成 独立模式下由服务器在IMSDK云通信后台确定加密秘钥回调给APP)
     */
    private void imLogin(@NonNull String identify, @NonNull String userSig) {
        TIMUser user = new TIMUser();
        user.setAccountType(String.valueOf(TCConstants.IMSDK_ACCOUNT));
        user.setAppIdAt3rd(String.valueOf(TCConstants.IMSDK_APPID));
        user.setIdentifier(identify);
        //发起登录请求
        TIMManager.getInstance().login(TCConstants.IMSDK_APPID, user, userSig, new TIMCallBack() {
            @Override
            public void onError(int i, String s) {
                if (null != mTCLoginCallback)
                    mTCLoginCallback.onFailure(i, s);
            }

            @Override
            public void onSuccess() {
                if (null != mTCLoginCallback)
                    mTCLoginCallback.onSuccess();
            }
        });
    }

步骤六、创建直播聊天室并获取会话conversation(收发消息时会用到)

 //创建聊天群组
    public void createGroup() {
        TIMGroupManager.CreateGroupParam param = TIMGroupManager.getInstance().new CreateGroupParam();
        param.setGroupType("AVChatRoom");
        param.setGroupName("小直播");
        param.setGroupId(TCConstants.GROUP_ID);
        TIMGroupManager.getInstance().createGroup(param, new TIMValueCallBack() {
            @Override
            public void onError(int i, String s) {
                Log.e("+++", "聊天群创建失败" + i + s);
            }

            @Override
            public void onSuccess(String roomId) {
                Log.e("+++", "聊天群创建成功roomId:" + roomId);
                conversation = TIMManager.getInstance().getConversation(TIMConversationType.Group, TCConstants.GROUP_ID);
            }
        });
    }

//解散群组  注意:直播大群只有群主可以解散
    public void deleteGroup() {

        if (TCConstants.GROUP_ID == null)
            return;

        TIMManager.getInstance().deleteConversation(TIMConversationType.Group, TCConstants.GROUP_ID);
        TIMGroupManager.getInstance().deleteGroup(TCConstants.GROUP_ID, new TIMCallBack() {
            @Override
            public void onError(int i, String s) {
                Log.e("+++", "聊天室解散失败:" + i + s);
            }

            @Override
            public void onSuccess() {
                Log.e("+++", "聊天室解散成功");
            }
        });
    }

步骤七、加入直播聊天室并获取会话conversation(收发消息时会用到)。至此直播端和观众端都加入到了聊天室

//加入聊天群组
    public void joinGroup() {
        TIMGroupManager.getInstance().applyJoinGroup(TCConstants.GROUP_ID, "some reason", new TIMCallBack() {
            @java.lang.Override
            public void onError(int code, String desc) {
                Log.e("+++", "加入群组失败" + desc);
            }

            @java.lang.Override
            public void onSuccess() {
                Log.e("+++", "加入群组成功");
                conversation = TIMManager.getInstance().getConversation(TIMConversationType.Group, TCConstants.GROUP_ID);
            }
        });
    }

 //退出群组 普通群成员
    public void quitGroup() {
        TIMGroupManager.getInstance().quitGroup(TCConstants.GROUP_ID, new TIMCallBack() {
            @Override
            public void onError(int i, String s) {
                Log.e("+++", "退出群组失败" + s);
            }

            @Override
            public void onSuccess() {
                Log.e("+++", "退出群组成功");
            }
        });
    }

步骤八、消息发送

/**
     * @param cmd 消息类型 ,可自己设定。比如1代表弹幕消息,2代表普通文本消息
     * @param param 消息内容
     * */
    private void send(int cmd, String param, TIMValueCallBack timValueCallBack) {
        JSONObject sendJson = new JSONObject();
        try {
            sendJson.put("userAction", cmd);
            sendJson.put("userId", TCConstants.USER_ID);
            sendJson.put("userName", TCConstants.USER_NAME);
            sendJson.put("headPic", TCConstants.USER_HEADPIC);
            sendJson.put("msg", param);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String str = sendJson.toString();
        TIMMessage msg = new TIMMessage();
        TIMTextElem elem = new TIMTextElem();
        elem.setText(str);
        if (msg.addElement(elem) != 0) {
            return;
        }
        if (conversation != null)
            conversation.sendMessage(msg, timValueCallBack);
    }


步骤九、消息接收。相对来说消息接收复杂一点,不过也就是步骤多点,一步步细心点就行。

①注册消息接收监听

TIMManager.getInstance().addMessageListener(this);

可在onDestroy中注销

TIMManager.getInstance().removeMessageListener(this);
TIMManager.getInstance().deleteConversation(TIMConversationType.Group, TCConstants.GROUP_ID);

②在onNewMessages中解析接收到的消息(注册了TIMMessageListener监听后,新消息都会响应到该方法中)

@Override
    public boolean onNewMessages(List list) {
        parseIMMessage(list);
        return false;
    }
/**
     * 解析TIM消息列表
     *
     * @param list 消息列表
     */
    private void parseIMMessage(List list) {

        for (int i = list.size() - 1; i >= 0; i--) {
            TIMMessage msg = list.get(i);
            for (int j = 0; j < msg.getElementCount(); ++j) {
                if (msg.getElement(j) == null)
                    continue;
                TIMElem elem = msg.getElement(j);
                //获取当前元素的类型
                TIMElemType elemType = elem.getType();
                if (elemType == TIMElemType.Text) {
                    //处理文本消息
                    try {
                        String jsonString = ((TIMTextElem) elem).getText();
                        JSONTokener jsonParser = new JSONTokener(jsonString);
                        JSONObject json = (JSONObject) jsonParser.nextValue();
                        int action = (int) json.get("userAction");
                        String userId = (String) json.get("userId");
                        String userName = (String) json.get("userName");
                        userName = TextUtils.isEmpty(userName) ? userId : userName;
                        String headPic = (String) json.get("headPic");
                        String str = (String) json.get("msg");
                        mTCChatRoomListener.onReceiveMsg(action, new TCSimpleUserInfo(userId, userName, headPic), str);
                    } catch (JSONException e) {
                        e.printStackTrace();
                        // 异常处理代码
                    }
                } else if (elemType == TIMElemType.Image) {
                    //处理图片消息
                }//...处理更多消息
            }
        }
    }

消息收发工作到这里就结束了,剩下的就是按照UI要求展示出来。相关代码在我上传DEMOTCChatRoomMgr有具体运用。下一篇文章我们接着谈直播的最后一环dfm弹幕的使用。











你可能感兴趣的:(移动直播)