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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...