官方集成文档地址点击打开链接 ,我使用的是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的
<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要求展示出来。相关代码在我上传DEMO中TCChatRoomMgr有具体运用。下一篇文章我们接着谈直播的最后一环dfm弹幕的使用。