0基礎入門Android端實時聊天

来源:https://www.cnblogs.com/zegodeveloper/archive/2022/07/06/16451906.html
-Advertisement-
Play Games

ZEGO 提供 ZIM + RTC 服務聯動的場景解決方案,公開語聊房、秀場直播等業務場景搭建的示例源碼,幫助開發者能在極短的時間內搭建完美的業務場景。 ...


ZEGO 提供 ZIM + RTC 服務聯動的場景解決方案,公開語聊房、秀場直播等業務場景搭建的示例源碼,幫助開發者能在極短的時間內搭建完美的業務場景。

ZIM SDK 提供瞭如下接入方案:

image

在此方案中,您需要通過您自己的業務系統實現以下業務邏輯:

  • 搭建客戶端的用戶管理邏輯,並下發用戶 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 服務所需的 AppIDServerSecret。ZIM 服務許可權不是預設開啟的,使用前,請先在 ZEGO 控制台 自助開通 ZIM 服務(詳情請參考 項目管理 - 即時通訊)、或聯繫 ZEGO 技術支持開通。
  • 已獲取登錄 SDK 所需的 Token,詳情請參考 使用 Token 鑒權

3 集成 SDK

3.1 新建項目

  1. 打開 Android Studio,選擇 “File > New > New Project” 菜單。
    image

  2. 填寫項目名及項目存儲路徑。
    image

  3. 其它按照預設設置,單擊 “Next”,最後單擊 “Finish” 完成新工程創建。

3.2 導入 SDK

目前支持的平臺架構包括:arm64-v8a、armeabi-v7a、x86、x86_64。

開發者可通過以下任意一種方式實現集成 SDK。

方式一:使用 JitPack 自動集成 SDK

  1. 進入項目根目錄,打開 “build.gradle” 文件,在 “allprojects” 中加入如下代碼。

    ...
    allprojects {
        repositories {
            maven { url 'https://www.jitpack.io' }
            google()
            jcenter()
        }
    }
    
  2. 進入 “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 文件手動集成

  1. 請參考 下載 SDK,下載最新版本的 SDK。

  2. 將 SDK 包解壓至項目目錄下,例如 “app/libs”。
    image

  3. 添加 SDK 引用。進入到 “app” 目錄,打開 “build.gradle” 文件。

    • 在 “defaultConfig” 節點添加 “ndk” 節點,指定支持的平臺類型。
      image
    ndk {
        abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64', 'x86' 
    }
    
    • 在 “android” 節點添加 “sourceSets” 節點,指定 “libs” 所在目錄。

    示例代碼中 “libs” 目錄僅為舉例,開發者可根據實際路徑填寫。

image

```gradle
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}
```

* 在 “dependencies” 節點引入 “libs” 下所有的 jar。  

image

```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 的消息交互為例:
image

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 介面調用時序圖如下:

image

獲取更多ZEGO SDK技術支持:

  • ZIM不僅具備全平臺互動、消息海量併發、合規安全可靠等產品特性。同時還可結合即構 RTC
    SDK實現各類音視頻場景的用戶互動,滿足Avatar , 直播,語聊房等實時互動場景。
  • 七周年福利:提交表單聯繫商務,有機會獲取即構IM1個月免費試用。;
音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用背景: 項目中需要用的富文本框去上傳視頻,圖片的話大部分都是可以的。相對來說,國外的富文本框很成熟。但鑒於文檔是英語,這裡使用了百度的富文本框。 採用的api的方式,調用介面進行上傳文件。話不多說,開擼! 準備: 創建一個.net mvc的項目。下載百度富文本框.net 版本的js文件。 創建項 ...
  • 目錄 一、前景回顧 二、編寫makefile 三、實現Assert斷言 四、實現字元串操作函數 五、測試 一、前景回顧 上一回我們詳細地講解了整個系統的中斷工作流程,整個中斷系統比較難的地方在於中斷的執行流程,我開始學的時候對這一塊也是比較模糊的,感覺不知從何入手。現在已經很清楚整個流程了,這裡可以 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 這篇文章主要給大家介紹了關於Linux系統中CPU占用率較高問題排查思路與解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Linux具有一定的參考學習價值,需要的朋友們下麵來一起學習學習吧 前言 作為 Linux 運維工程師,在日常工 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一、部署zabbix 代理伺服器 分散式監控的作用: 分擔 server 的集中式壓力 解決多機房之間的網路延時問題 bsystemctl disable --now firewalld setenforce 0 hostnamectl set- ...
  • 近日,中國信通院、雲計算開源產業聯盟正式對外發佈《雲原生產品目錄》,騰訊雲原生資料庫TDSQL-C憑藉其超強性能、極致效率的彈性伸縮和完善的產品化解決方案體系,成功入圍目錄。 全球數字經濟進入高速發展期,在敏捷、高效、降本需求的驅動下,雲原生已經成為提升雲計算使用效能的關鍵支撐,正引領新一代軟體架構 ...
  • 機器規劃 環境準備 安裝JDK 1. 在所有機器上安裝jdk8 2. 配置好環境變數 vi /etc/profile JAVA_HOME=/usr/local/jdk1.8.0_152 PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME export PATH so ...
  • 7月4日,國際權威機構IDC發佈的《2021年下半年中國關係型資料庫軟體市場跟蹤報告》顯示,騰訊雲資料庫在關係型資料庫軟體市場(公有雲模式)中,位列第二。 IDC報告顯示,2021下半年中國關係型資料庫軟體市場規模為15.8億美元,同比增長34.9%。其中,公有雲關係型資料庫規模8.7億美元,同比增 ...
  • #RDD(2) ##RDD轉換運算元 RDD根據數據處理方式的不同將運算元整體上分為Value類型、雙Value類型、Key-Value類型 ###value類型 ####map 函數簽名 def map[U:ClassTag](f:T=>U):RDD[U] 函數說明 將處理的數據逐條進行映射轉換,這裡 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...