主頁 > 移動端開發 > 0基礎入門Android端實時聊天

0基礎入門Android端實時聊天

2022-07-14 13:14:01 移動端開發

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 = "https://www.cnblogs.com/zegodeveloper/archive/2022/07/06/離線推送的擴展資訊";
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)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/499216.html

標籤:其他

上一篇:記錄uni-app 打包成apk后獲取定位

下一篇:AndroidUI繪制流程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more