Android端集成
互動(dòng)消息是用于加強(qiáng)直播間消息溝通、提升交互體驗(yàn)的服務(wù)。提供了豐富、易集成的SDK,可在用戶開(kāi)發(fā)的直播應(yīng)用中輕松集成評(píng)論、彈幕、點(diǎn)贊等能力。本文介紹Android端集成互動(dòng)消息應(yīng)用的操作步驟。
前提條件
客戶端集成前,請(qǐng)確保已完成服務(wù)端集成,并提供客戶端訪問(wèn)的獲取鑒權(quán)Token的接口。詳細(xì)操作,請(qǐng)參見(jiàn)服務(wù)端集成。
環(huán)境要求
Android 5.0(SDK API Level 21)及以上版本。
Android Studio 4.0以及以上版本。
集成SDK
添加Maven倉(cāng)庫(kù)。
repositories { maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' } }
添加SDK依賴。
// 互動(dòng)庫(kù) implementation "com.aliyun.sdk.android:AliVCInteractionMessage:1.3.2"
配置
AndroidManifest.xml
權(quán)限。<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
使用SDK
SDK使用需遵循如下操作順序:
初始化
登錄
相關(guān)操作
登出
反初始化
其中相關(guān)操作包含群組操作和消息操作,詳細(xì)說(shuō)明如下:
群組操作
創(chuàng)建群組(需要以管理員身份進(jìn)行登錄才能操作)
關(guān)閉群組(僅限群主/群管理員操作)
進(jìn)入群組
離開(kāi)群組
查詢?nèi)航M信息
修改群組消息(僅限群主/群管理員操作)
查詢?nèi)航M最近成員列表
查詢?nèi)航M全部成員(僅限群主/群管理員操作)
對(duì)群組進(jìn)行禁言(僅限群主/群管理員操作)
對(duì)群組取消禁言(僅限群主/群管理員操作)
對(duì)群組的用戶進(jìn)行禁言(僅限群主/群管理員操作)
對(duì)群組的用戶取消禁言(僅限群主/群管理員操作)
查詢?nèi)航M內(nèi)被禁言的用戶列表(僅限群主/群管理員操作)
消息操作
單發(fā)消息
群發(fā)消息
查詢最近群發(fā)消息列表
查詢?nèi)咳喊l(fā)消息(僅限群主/群管理員操作)
刪除/撤回群消息
查詢歷史消息
注意事項(xiàng)
各ID需遵循以下規(guī)則:
appid :最長(zhǎng)64位,僅限于A~Z,a~z, 0~9及“-”, 不能包含其他字符
userid:最長(zhǎng)64位,僅限于A~Z,a~z, 0~9及“-”, 不能包含其他字符
groupid:最長(zhǎng)64位,僅限于A~Z,a~z, 0~9及“-”, 不能包含其他字符
初始化
在App入口(如Application/Activity的onCreate中)進(jìn)行初始化配置。
ImSdkConfig config = new ImSdkConfig();
config.deviceId = "deviceId"; //[選填]
config.appId = "appId"; //[必填],傳空會(huì)返回初始化失敗-2
config.appSign = "appSign"; //[必填],傳空會(huì)返回初始化失敗-2
// 初始化返回非0,表示初始化失敗,其中1001:重復(fù)初始化、1002:創(chuàng)建底層引擎失敗、-1:底層重復(fù)初始化、-2:初始化配置信息有誤
int ret = AliVCIMEngine.instance().init(context, config);
監(jiān)聽(tīng)長(zhǎng)連接狀態(tài)
AliVCIMEngine.instance().addSdkListener(new ImSdkListener() {
@Override
public void onConnecting() {
}
@Override
public void onConnectSuccess() {
}
@Override
public void onConnectFailed(com.aliyun.im.common.Error error) {
}
@Override
public void onDisconnect(int code) {
}
// 登錄token失效(如token過(guò)期)會(huì)通過(guò)該接口獲取新的token,務(wù)必實(shí)現(xiàn)該接口
@Override
public void onTokenExpired(ImTokenCallback callback) {
// 第一步,實(shí)現(xiàn)新token的生成,若需要網(wǎng)絡(luò)請(qǐng)求等耗時(shí)操作,請(qǐng)務(wù)必拋到異步線程實(shí)現(xiàn);
// 第二步,若token生成失敗,則通過(guò) callback.onError() 回調(diào)錯(cuò)誤信息;
// 若token生成成功,則通過(guò) callback.onSuccess() 回調(diào)token信息;
}
@Override
public void onReconnectSuccess(ArrayList<ImGroupInfo> groupStatus) {
}
});
登錄
ImLoginReq req = new ImLoginReq();
req.user.userId = userId;
//透?jìng)鳂I(yè)務(wù)額外信息
Map<String, Object> data = new HashMap<>();
data.put("level", "high");
req.user.userExtension = App.getGson().toJson(data).toString();
req.userAuth = new ImAuth(nonce, timestamp, role, app_token);
AliVCIMEngine.instance().login(req, new ImSdkCallback());
其中role參數(shù),有兩種角色:
管理員(值:admin)
admin角色,可以創(chuàng)建/關(guān)閉群組,如果不需要可以設(shè)置為空。其中,非管理員的所有操作,管理員均能操作。
非管理員(值:非admin)
登出
AliVCIMEngine.instance().logout();
反初始化
登出后進(jìn)行反初始化。
AliVCIMEngine.instance().unInit();
消息服務(wù)
//消息服務(wù)
AliVCIMMessageInterface messageInterface = AliVCIMEngine.instance().getMessageManager();
非管理員操作
監(jiān)聽(tīng)消息
//監(jiān)聽(tīng)消息
messageInterface.addMessageListener(new ImMessageListener() {
@Override
public void onRecvC2cMessage(ImMessage msg) {
}
@Override
public void onRecvGroupMessage(ImMessage msg, String groupId) {
}
@Override
public void onDeleteGroupMessage(String msgId, String groupId) {
}
});
發(fā)送C2C消息
ImSendMessageToUserReq req = new ImSendMessageToUserReq();
req.type = 88888;
req.data = "This is a test message";
req.receiverId = userInput.getText().toString();
// 需確保對(duì)方在線,否則會(huì)返回錯(cuò)誤碼424,此時(shí)建議待對(duì)方上線后再重發(fā)
messageInterface.sendC2cMessage(req, new ImSdkValueCallback<ImSendMessageToUserRsp>() {
@Override
public void onSuccess(ImSendMessageToUserRsp data) {
Log.v(ImTag.TAG, "發(fā)送C2C消息成功:" + data.messageId);
}
@Override
public void onFailure(Error error) {
Log.v(ImTag.TAG, "發(fā)送C2C消息失敗:error" + error.code);
}
});
在群組內(nèi)發(fā)送全員消息
ImSendMessageToGroupReq req = new ImSendMessageToGroupReq();
req.level = ImMessageLevel.HIGH;
req.type = 88888;
req.data = "a test";
req.groupId = groupId;
// 需確保已經(jīng)加入群成功(即在AliVCIMGroupInterface.joinGroup回調(diào)成功之后),再發(fā)送群組消息,否則會(huì)返回錯(cuò)誤碼425
messageInterface.sendGroupMessage(req, new ImSdkValueCallback<ImSendMessageToGroupRsp>() {
@Override
public void onSuccess(ImSendMessageToGroupRsp data) {
Log.v(ImTag.TAG, "發(fā)送高優(yōu)先級(jí)群消息成功:" + data.messageId);
}
@Override
public void onFailure(Error error) {
Log.v(ImTag.TAG, "發(fā)送高優(yōu)先級(jí)群消息成功" + error.code);
}
});
查詢最近消息列表
ImListRecentMessageReq req;
req.groupId = groupId;
messageInterface.listRecentMessage(req, new ImSdkValueCallback<ImListRecentMessageRsp>() {
@Override
public void onSuccess(ImListRecentMessageRsp data) {
}
@Override
public void onFailure(com.aliyun.im.common.Error error) {
}
});
//該接口主要用戶直播結(jié)束后的歷史消息回放,用戶無(wú)需進(jìn)入群組可查詢,比較耗時(shí),在直播過(guò)程中不建議使用,另外該接口后續(xù)會(huì)收費(fèi)。
ImListHistoryMessageReq req = new ImListHistoryMessageReq();
req.groupId = "群ID";
req.nextPageToken = 231231; //不傳時(shí)表示第一頁(yè),遍歷時(shí)服務(wù)端會(huì)返回下一頁(yè)Token,客戶端獲取下一頁(yè)時(shí)應(yīng)帶上
req.type = 99999; // 自定義消息類型,需大于10000
req.sortType = ImSortType.ASC;
req.pageSize = 20;
req.beginTime = 0; // 按時(shí)間范圍遍歷,開(kāi)始時(shí)間,單秒,為0時(shí)表示最早時(shí)間
req.endTime = 0; // 按時(shí)間范圍遍歷,結(jié)束時(shí)間,單秒,為0時(shí)表示最晚時(shí)間
messageInterface.listHistoryMessage(req, new ImSdkValueCallback<ImListHistoryMessageRsp>() {
@Override
public void onSuccess(ImListHistoryMessageRsp rsp) {
}
@Override
public void onFailure(Error error) {
}
});
ImDeleteMessageReq req = new ImDeleteMessageReq();
req.groupId = "群ID";
req.messageId = "消息ID";
messageInterface.deleteMessage(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
管理員操作
查詢消息列表
//該接口(僅限群主/群管理員操作)
ImListMessageReq req = new ImListMessageReq();
req.groupId = "群ID";
req.nextPageToken = 231231; //不傳時(shí)表示第一頁(yè),遍歷時(shí)服務(wù)端會(huì)返回下一頁(yè)Token,客戶端獲取下一頁(yè)時(shí)應(yīng)帶上
req.type = 99999; // 自定義消息類型,需大于10000
req.sortType = ImSortType.ASC;
req.pageSize = 20;
req.beginTime = 0; // 按時(shí)間范圍遍歷,開(kāi)始時(shí)間,單秒,為0時(shí)表示最早時(shí)間
req.endTime = 0; // 按時(shí)間范圍遍歷,結(jié)束時(shí)間,單秒,為0時(shí)表示最晚時(shí)間
messageInterface.listMessage(req, new ImSdkValueCallback<ImListMessageRsp>() {
@Override
public void onSuccess(ImListMessageRsp rsp) {
}
@Override
public void onFailure(Error error) {
}
});
群組服務(wù)
//群組服務(wù)
AliVCIMGroupInterface groupInterface = AliVCIMEngine.instance().getGroupManager();
非管理員操作
監(jiān)聽(tīng)群組狀態(tài)
//監(jiān)聽(tīng)群組
groupManager.addGroupListener(new ImGroupListener() {
@Override
public void onMemberChange(String groupId, int memberCount, ArrayList<ImUser> joinUsers, ArrayList<ImUser> leaveUsers) {
}
@Override
public void onExit(String groupId, int reason) {
}
@Override
public void onMuteChange(String groupId, ImGroupMuteStatus status) {
}
@Override
public void onInfoChange(String groupId, ImGroupInfoStatus info) {
}
});
加入群組
ImJoinGroupReq req = new ImJoinGroupReq();
req.groupId = groupId;
groupInterface.joinGroup(req, new ImSdkValueCallback<ImJoinGroupRsp>() {
@Override
public void onSuccess(ImJoinGroupRsp data) {
}
@Override
public void onFailure(Error error) {
}
});
離開(kāi)群組
ImLeaveGroupReq req = new ImLeaveGroupReq();
req.groupId = groupId;
groupInterface.leaveGroup(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
查看最近群組成員
ImListRecentGroupUserReq req = new ImListRecentGroupUserReq();
req.groupId = groupId;
groupManager.listRecentGroupUser(req, new ImSdkValueCallback<ImListRecentGroupUserRsp>() {
@Override
public void onSuccess(ImListRecentGroupUserRsp data) {
}
@Override
public void onFailure(Error error) {
}
});
管理員操作
創(chuàng)建群組
ImCreateGroupReq req = new ImCreateGroupReq();
req.groupName = "羽毛球群";
Map<String, Object> data = new HashMap<>();
data.put("desc", "一三五晚8-10");
req.groupMeta = App.getGson().toJson(data).toString();
groupInterface.createGroup(req, new ImSdkValueCallback<ImCreateGroupRsp>() {
@Override
public void onSuccess(ImCreateGroupRsp data) {
Log.v(ImTag.TAG, "Create Group Success:" + data.groupId);
}
@Override
public void onFailure(com.aliyun.im.common.Error error) {
Log.v(ImTag.TAG, "Create Group Failure:" + error.getCode());
}
});
刪除群組
ImCloseGroupReq req = new ImCloseGroupReq();
req.groupId = groupId;
groupInterface.closeGroup(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
修改群組
ImModifyGroupReq req = new ImModifyGroupReq();
req.groupId = groupId;
req.admins.add(adminUserId);//指定群管理員ID列表,最多設(shè)置3個(gè)管理員;若需要清空列表,則配置空列表或者不設(shè)置,同時(shí)必須設(shè)置req.forceUpdateAdmins=true;
req.groupMeta = "群信息拓展字段";//添加群拓展信息;若需要清空,則配置空字符串或者不設(shè)置,同時(shí)必須設(shè)置req.forceUpdateGroupMeta=true;
groupInterface.modifyGroup(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
查詢?nèi)航M成員
ImListGroupUserReq req = new ImListGroupUserReq();
req.groupId = groupId;
req.sortType = ImSortType.ASC;
req.pageSize = 30;
groupManager.listGroupUser(req, new ImSdkValueCallback<ImListGroupUserRsp>() {
@Override
public void onSuccess(ImListGroupUserRsp data) {
}
@Override
public void onFailure(Error error) {
}
});
全體禁言
ImMuteAllReq req = new ImMuteAllReq();
req.groupId = groupId;
groupInterface.muteAll(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
取消禁言
ImCancelMuteAllReq req = new ImCancelMuteAllReq();
req.groupId = groupId;
groupInterface.cancelMuteAll(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
禁言指定用戶
ImMuteUserReq req = new ImMuteUserReq();
req.groupId = groupId;
req.userList.add(muteUserId);
groupInterface.muteUser(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
取消禁言
ImCancelMuteUserReq req = new ImCancelMuteUserReq();
req.groupId = groupId;
req.userList.add(muteUserId);
groupInterface.cancelMuteUser(req, new ImSdkCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(Error error) {
}
});
查詢禁言用戶
ImListMuteUsersReq req = new ImListMuteUsersReq();
req.groupId = groupId;
groupManager.listMuteUsers(req, new ImSdkValueCallback<ImListMuteUsersRsp>() {
@Override
public void onSuccess(ImListMuteUsersRsp data) {
}
@Override
public void onFailure(Error error) {
}
});