IM SDK使用

官方集成文檔地址點擊打開鏈接  ,我使用的是IM SDK V2.X版本,所以集成步驟會按照該版本進行,與IMSDK V3.x會有一些細微的差別。

步驟一、註冊雲通信,創建並配置應用。


配置可選擇獨立模式接入和託管模式接入。配置的流程和使用流程大致相同,所以建議初學只是想摸清楚流程的可以選擇對接託管模式。


步驟二、下載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的<application></application>中添加以下配置:

<!--  消息收發service -->
<service
    android:name="com.tencent.qalsdk.service.QalService"
    android:exported="false" 
    android:process=":QALSERVICE" >  
</service> 
<!--  消息收發輔助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<String>() {
            @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<TIMMessage> 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<TIMMessage> list) {
        parseIMMessage(list);
        return false;
    }
/**
     * 解析TIM消息列表
     *
     * @param list 消息列表
     */
    private void parseIMMessage(List<TIMMessage> 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彈幕的使用。











發佈了24 篇原創文章 · 獲贊 43 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章