ZEGO 提供 ZIM + RTC 服務聯動的場景解決方案,公開語聊房、秀場直播等業務場景搭建的示例源碼,幫助開發者能在極短的時間內搭建完美的業務場景。 ...
ZEGO 提供 ZIM + RTC 服務聯動的場景解決方案,公開語聊房、秀場直播等業務場景搭建的示例源碼,幫助開發者能在極短的時間內搭建完美的業務場景。
ZIM SDK 提供瞭如下接入方案:
在此方案中,您需要通過您自己的業務系統實現以下業務邏輯:
- 搭建客戶端的用戶管理邏輯,並下發用戶 ID 用於客戶端登錄。
- 鑒權 Token,建議由您的業務後臺自行實現,保證鑒權數據安全。
2 前提條件
在使用 ZIM SDK 前,請確保:
- 開發環境滿足以下要求:
- Android Studio 2.1 或以上版本。
- Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。
- Android 9.0 或以上版本,且支持音視頻的 Android 設備或模擬器(推薦使用真機)。
- 已在 ZEGO 控制台 創建項目,獲取到了接入 ZIM SDK 服務所需的
AppID
和ServerSecret
。ZIM 服務許可權不是預設開啟的,使用前,請先在 ZEGO 控制台 自助開通 ZIM 服務(詳情請參考 項目管理 - 即時通訊)、或聯繫 ZEGO 技術支持開通。 - 已獲取登錄 SDK 所需的 Token,詳情請參考 使用 Token 鑒權。
3 集成 SDK
3.1 新建項目
-
打開 Android Studio,選擇 “File > New > New Project” 菜單。
-
填寫項目名及項目存儲路徑。
-
其它按照預設設置,單擊 “Next”,最後單擊 “Finish” 完成新工程創建。
3.2 導入 SDK
目前支持的平臺架構包括:arm64-v8a、armeabi-v7a、x86、x86_64。
開發者可通過以下任意一種方式實現集成 SDK。
方式一:使用 JitPack 自動集成 SDK
-
進入項目根目錄,打開 “build.gradle” 文件,在 “allprojects” 中加入如下代碼。
... allprojects { repositories { maven { url 'https://www.jitpack.io' } google() jcenter() } }
-
進入 “app” 目錄,打開 “build.gradle” 文件,在 “dependencies” 中添加
implementation 'com.github.zegolibrary:zim:x.y.z'
。“x.y.z” 為 SDK 的版本號,請參考 發佈日誌 中的發佈歷史獲取。... dependencies { ... // x.y.z 請填寫具體版本號,如:1.2.0 // 可通過 SDK 發佈歷史取得最新版本號 implementation 'com.github.zegolibrary:zim:x.y.z' }
方式二:複製 SDK 文件手動集成
-
請參考 下載 SDK,下載最新版本的 SDK。
-
將 SDK 包解壓至項目目錄下,例如 “app/libs”。
-
添加 SDK 引用。進入到 “app” 目錄,打開 “build.gradle” 文件。
- 在 “defaultConfig” 節點添加 “ndk” 節點,指定支持的平臺類型。
ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64', 'x86' }
- 在 “android” 節點添加 “sourceSets” 節點,指定 “libs” 所在目錄。
示例代碼中 “libs” 目錄僅為舉例,開發者可根據實際路徑填寫。
- 在 “defaultConfig” 節點添加 “ndk” 節點,指定支持的平臺類型。
```gradle
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
```
* 在 “dependencies” 節點引入 “libs” 下所有的 jar。
```gradle
implementation fileTree(dir: 'libs', include: ['*.jar'])
```
3.3 設置許可權
開發者可以根據實際應用需要,設置應用所需許可權。
進入 “app/src/main” 目錄,打開 “AndroidManifest.xml” 文件,添加許可權。
<!-- SDK 必須使用的許可權 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3.4 防止混淆代碼
在 “proguard-rules.pro” 文件中,為 SDK 添加 -keep
類的配置,防止混淆 SDK 公共類名稱。
-keep class **.zego.**{*;}
4 實現基本收發消息
以下流程中,我們以客戶端 A 和 B 的消息交互為例:
4.1 實現流程
請參考 跑通示例源碼 獲取源碼,相關功能的源碼請查看 “app/src/main/java/im/zego/zimexample/ui/room/ZIMPeerSessionActivity” 目錄下的文件。
1. 導入類文件
在項目文件中引入類文件。
import im.zego.zim.ZIM;
2. 創建 ZIM 實例
首先我們需要在 SDK 中創建 ZIM 實例,一個實例對應的是一個用戶,表示一個用戶以客戶端的身份登錄系統。
例如,客戶端 A、B 分別調用 create 介面,傳入在 2 前提條件 中獲取到的 AppID,創建了 A、B 的實例:
// 創建 ZIM 對象,傳入 APPID 與 Android 中的 Application
zim = ZIM.create(appID, application);
ZIM 創建單例的示例
由於大多數開發者,在整個流程中,只需要將 ZIM 實例化一次,因此 ZEGO 建議您將 ZIM 單例化並保存。
創建一個 SDKManager 類,在該類中聲明並實現了一個 “sharedInstance” 靜態方法,該方法將會在首次調用時創建並返回一個 SDKManager 的對象,在該對象中調用 ”create“,此後在項目的任意位置導入 SDKManager 類,調用 “SDKManager.sharedInstance().zim” 將會返回 zim 對象。
public class SDKManager {
private static SDKManager sdkManager;
public ZIM zim;
public static SDKManager sharedInstance() {
if (sdkManager == null) {
synchronized (SDKManager.class) {
if (sdkManager == null) {
sdkManager = new SDKManager();
}
}
}
return sdkManager;
}
public void create(Application application) {
zim = ZIM.create(ZegoAppID.appID, application);
}
}
3. 設置 setEventHandler 回調
在客戶端登錄前,開發者可以通過調用 setEventHandler
介面,自定義 ZIM 中的事件回調,接收到 SDK 異常、消息通知回調等的通知。
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onReceivePeerMessage(ZIM zim, ArrayList<ZIMMessage> messageList, String fromUserID) {
// 收到“單聊”通信的消息回調
}
});
4. 登錄 ZIM
創建實例後,客戶端 A 和 B 需要登錄 ZIM,只有登錄成功後才可以開始發送、接收消息、更新 Token 等。
客戶端需要使用各自的用戶信息和 Token 進行登錄。調用 login
介面進行登錄,傳入用戶信息 ZIMUserInfo
對象,以及在 2 前提條件 中獲取到的 Token 進行鑒權,鑒權通過後才能登錄成功。
- “userID”、“userName” 支持開發者自定義規則生成。建議開發者將 “userID” 設置為一個有意義的值,可將其與自己的業務賬號系統進行關聯。
- 如果 Token 過期,需要在
tokenWillExpire
即將過期回調介面中,調用renewToken
介面,更新 Token 後才能正常使用 SDK。
// 登錄時,需要開發者 按照 "使用 Token 鑒權" 文檔生成 token 即可
// userID 和 userName,最大 32 位元組的字元串。僅支持數字,英文字元 和 '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '-', '`', ';', '’', ',', '.', '<', '>', '/', '\'。
ZIMUserInfo zimUserInfo = new ZIMUserInfo();
zimUserInfo.userID = userID;
zimUserInfo.userName = userName;
zim.login(zimUserInfo, token, new ZIMLoggedInCallback() {
@Override
public void onLoggedIn(ZIMError error) {
// 開發者可根據 ZIMError 來判斷是否登錄成功。
}
});
5. 發送單聊消息
客戶端 A 登錄成功後,可以向客戶端 B 發送消息。
目前 ZIM 支持的消息類型如下:
消息類型 | 說明 | 特性及適用場景 |
---|---|---|
ZIMTextMessage(1) | 文本消息。消息大小不超過 32 KB,單個客戶端發送頻率限製為 10 次/秒。 | 消息可靠有序,可存儲為歷史消息;一般適用於“單聊”、“群聊”等即時聊天的場景。 |
ZIMCommandMessage(2) | 開發者可自定義數據類型的信令消息。消息大小不超過 5 KB,單個客戶端發送頻率限製為 10 次/秒。 | 支持更高的併發;一般適用於“語聊房”、“線上課堂”等房間內的即時聊天;房間解散後,消息不保存。 |
ZIMBarrageMessage(20) | 房間內彈幕文本消息。消息大小不超過 5 KB,單個客戶端發送頻率無限制。 | 專門用於房間內的高頻、不可靠、允許丟掉的消息,一般適用於發送“彈幕消息”的場景中。 支持高併發,但不可靠,不保證消息送達。 |
客戶端 A 可以調用 sendPeerMessage
介面,傳入客戶端 B 的 userID、消息內容等信息,即可發送一條消息到 B 的客戶端,同時可以通過 onMessageSent
介面的回調信息,判斷消息是否發送成功。
// 發送“單聊”通信的信息
String toUserID = "xxxx";
ZIMTextMessage zimMessage = new ZIMTextMessage();
zimMessage.message = "消息內容";
ZIMMessageSendConfig config = new ZIMMessageSendConfig();
// 消息優先順序,取值為 低:1 預設,中:2,高:3
config.priority = ZIMMessagePriority.LOW;
// 設置消息的離線推送配置
ZIMPushConfig pushConfig = new ZIMPushConfig();
pushConfig.title = "離線推送的標題";
pushConfig.content= "離線推送的內容";
pushConfig.extendedData = "離線推送的擴展信息";
config.pushConfig = pushConfig;
zim.sendPeerMessage(zimMessage, toUserID, config, new ZIMMessageSentCallback() {
@Override
public void onMessageSent(ZIMMessage zimMessage, ZIMError error) {
// 開發者可以通過該回調監聽消息是否發送成功。
}
});
6. 接收單聊消息
客戶端 B 登錄 ZIM 後,將會收到在 setEventHandler
回調中設置的 onReceivePeerMessage
監聽介面,收到客戶端 A 發送過來的消息。
收到消息時,由於類型是基類,首先需要判斷消息類型是 Text 還是 Command,開發者需要強轉基類為具體的子類,然後從 message 欄位獲取消息內容。
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onReceivePeerMessage(ZIM zim, ArrayList<ZIMMessage> messageList, String fromUserID) {
for (ZIMMessage zimMessage : messageList) {
if (zimMessage instanceof ZIMTextMessage)
{
ZIMTextMessage zimTextMessage = (ZIMTextMessage) zimMessage;
Log.e(TAG, "收到的消息:"+ zimTextMessage.message);
}
}
}
});
7. 退出登錄
如果客戶端需要退出登錄,直接調用 logout
介面即可。
zim.logout();
8. 銷毀 ZIM 實例
如果不需要 ZIM 實例,可直接調用 destroy
介面,銷毀實例。
zim.destroy();
4.2 API 時序圖
通過以上的實現流程描述,API 介面調用時序圖如下:
獲取更多ZEGO SDK技術支持:
- ZIM不僅具備全平臺互動、消息海量併發、合規安全可靠等產品特性。同時還可結合即構 RTC
SDK實現各類音視頻場景的用戶互動,滿足Avatar , 直播,語聊房等實時互動場景。 - 七周年福利:提交表單聯繫商務,有機會獲取即構IM1個月免費試用。;