JMessage Android 端開發詳解


目前越來越多的應用會需要集成即時通訊功能,這里就為大家詳細講一下如何通過集成 JMessage 來為你的 App 增加即時通訊功能。

首先,一個最基礎的 IM 應用會需要有哪些功能?

那么我們又該如何用 JMessage 來實現這些功能呢?

當然啦,你需要先為自己的應用集成 JMessage SDK,具體的集成方法可以參考集成文檔,這里就不再重復啦。: )

下面我們就來看看這些功能模塊具體應該怎樣開發?

在功能模塊開發之前,需要先調用 JMessageClient.init(applicationContext) 方法來初始化 SDK,推薦在 Application 類中調用。

用戶注冊 / 登錄

注冊

JMessage 對於用戶的注冊,默認必需的只有用戶名和密碼,對於用戶名和密碼的要求如下:

參數 字符說明 長度限制
username 以字母或者數字開頭。支持字母、數字、下划線、英文點、減號、 @ Byte(4~128)
password 不限 Byte(4~128)

用戶注冊方法:

JMessageClient.register(username, password, new BasicCallback() {
  @Override
  public void gotResult(int code, String desc) {
    if (code == 0) {
      // 注冊成功
    } else {
      // 注冊失敗。status:錯誤碼;desc:錯誤描述
    }
  }
})

在你 App 的注冊界面調用該方法后,便將用戶注冊到了極光服務器,就不需要自己來維護,除此之外 JMessage 還提供了設置用戶昵稱(nickname)、生日(birthday)、個性簽名(signature)、性別(gender)、地區(region)和頭像(avatar)的方法。

詳情可以參考相關 API 文檔

登錄

在注冊成功后,注冊的用戶就可以通過登錄 API 來進行登錄,之后便能夠收發消息了。

登錄 API 的用法和注冊類似,大家可以直接參考 API 文檔

管理聊天會話

在 IM 應用中,聊天會話就是一個用戶同另一個用戶 / 群組的聊天關系。在 JMessage 中定義聊天會話的為 Conversation 類。

像發送消息、獲取歷史消息、獲取會話中對方用戶的信息等和具體聊天會話相關的方法都存在於 Conversation 中。

首先,在 JMessage 中 Conversation 分為單聊會話和群聊會話。具體用法基本相同,只是有些地方需要大家注意下:

  1. Conversation 中的 getTitle() 方法會返回聊天會話的標題,在不同情況下會有不同的返回值:
    • 單聊會話:用戶有昵稱時顯示昵稱,沒有昵稱時顯示用戶名。
    • 群聊會話:有群名稱時顯示群名稱,沒有時顯示群中前五個用戶的名稱(類似 QQ 討論組)。
  2. getTargetInfo() 會獲取會話中的目標對象信息,其返回值為 Object,需要根據具體情況將其轉型為 UserInfo 或 GroupInfo,再分別處理。
  3. 會話信息是保存在設備數據庫中的,因此如果用戶更換了設備,是無法獲取歷史會話的。
  4. 因為 JMessage 默認在收到聊天消息時會有通知提示,如果想要在進入和某個用戶 / 群組的聊天界面后,不再顯示該會話的通知提示,需要在進入會話界面時調用 JMessageClient.enterSingleConversation(username,appKey)JMessageClient.enterGroupConversation(groupId),退出聊天界面時則調用 JMessageClient.exitConversation() 來重新啟用對該會話的消息通知。

發送消息

目前最新版本的 JMessage 支持文字、圖片、語音、位置、文件和自定義幾種類型的消息,基本的用法大家可以直接參考 API 文檔,這里就不再贅述了。

這里需要注意的是 JMessage 提供了兩種創建消息的方式:

  1. JMessageClient.create*Message()
  2. conversation.createSendMessage(MessageContent)

兩種方式的結果其實是一樣的,都是返回一條創建好的 Message 對象。區別就在於如果你不光要發送消息,還需要 Conversation 對象的其他方法,比如獲取對方的信息、頭像什么的,那么推薦使用第二種方法。如果僅僅是單獨的發消息,就可以直接用第一種方法來創建。

創建完消息之后,就需要設置發送結果監聽了,代碼如下:

message.setOnSendCompleteCallback(new BasicCallback() {
  @Override
  public void gotResult(int responseCode, String responseDesc) {
    if (responseCode == 0) {
      // 消息發送成功
    } else {
      // 消息發送失敗
    }
  }
 });
JMessageClient.sendMessage(message);    // 之后再調用發送消息 API

下面講一下 JMessage 中幾種不同的消息類型,有什么需要注意的小細節:

  • JMessage 中的自定義消息(Custom message)與 JPush 中的自定義消息概念類似,當收到其他用戶發送的自定義消息時是不會顯示通知欄提示的。
  • 除去自定義消息,其他的幾種消息在創建時是可以指定 fromName 這個參數的,自定義的 fromName 將在消息接收方的通知欄作為展示名展示出來,如果未設置則會依照用戶的昵稱 > 用戶名的優先級來展示。
  • 在使用上面提到的第二種創建消息的方式時,參數 MessageContent 其實是可以添加附加字段的,附加字段不會顯示在通知欄中,由開發者自己決定取到附加字段后進行怎樣的操作。

接收消息

在了解發送消息后,下一步要做的當然就是接收消息啦。對於接受消息的代碼寫法,大家可以參考開發指南文檔,這里就不再一一列舉了。

總體來說,接收消息的處理還是很簡單的,參考開發文檔后基本寫法就能了解了。這里講幾個需要注意的地方:

  • 對於圖片消息,用戶在收到時,JMessage 默認會先下載一張縮略圖並緩存到本地,但這個過程是有可能失敗的,因此可以判斷當消息狀態為 receive_fail 時,再手動調用 downloadThumbnailImage 方法進行下載,代碼如下:
switch (msg.getContentType()) {
  case image:
    ImageContent imageContent = (ImageContent) msg.getContent();
    if (msg.getStatus() == MessageStatus.receive_fail) {
      imageContent.downloadThumbnailImage(msg, new DownloadCompletionCallback() {        
        @Override        
        public void onComplete(int code, String desc, File file) {                    
          if (code == 0) {    
            // 下載成功
          } else {    
            // 下載失敗
          }
        }
      });
    }
}

語音消息也是同樣,僅當自動下載失敗,消息狀態為 receive_fail 時才需要手動調用 downloadVoiceFile 方法來下載。

  • 圖片和文件消息附帶的文件,在收到消息后是不會自動下載文件附件的,需要開發者再調用另外的接口。分別是:
    • ImageContent.downloadOriginImage(Message, DownloadCompletionCallback)
    • FileContent.downloadFile(Message, DownloadCompletionCallback)
      因此這兩種類型消息的 getLocalPath() 方法需要在上面的 API 調用完成后才能返回有效值。

以上,就是使用 JMessage 開發一個基礎 IM 應用的步驟和一些值得注意的地方,快來試試吧。: )

如果您想要一個完整的項目參考,可以戳這里

作者:Hevin - 極光
原文:JMessage Android 端開發詳解
知乎專欄:極光日報


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM