官方集成文檔地址點擊打開鏈接 ,我使用的是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要求展示出來。相關代碼在我上傳DEMO中TCChatRoomMgr有具體運用。下一篇文章我們接着談直播的最後一環dfm彈幕的使用。