目前越來越多的應用會需要集成即時通訊功能,這里就為大家詳細講一下如何通過集成 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 分為單聊會話和群聊會話。具體用法基本相同,只是有些地方需要大家注意下:
- Conversation 中的 getTitle() 方法會返回聊天會話的標題,在不同情況下會有不同的返回值:
- 單聊會話:用戶有昵稱時顯示昵稱,沒有昵稱時顯示用戶名。
- 群聊會話:有群名稱時顯示群名稱,沒有時顯示群中前五個用戶的名稱(類似 QQ 討論組)。
- getTargetInfo() 會獲取會話中的目標對象信息,其返回值為 Object,需要根據具體情況將其轉型為 UserInfo 或 GroupInfo,再分別處理。
- 會話信息是保存在設備數據庫中的,因此如果用戶更換了設備,是無法獲取歷史會話的。
- 因為 JMessage 默認在收到聊天消息時會有通知提示,如果想要在進入和某個用戶 / 群組的聊天界面后,不再顯示該會話的通知提示,需要在進入會話界面時調用 JMessageClient.enterSingleConversation(username,appKey) 或 JMessageClient.enterGroupConversation(groupId),退出聊天界面時則調用 JMessageClient.exitConversation() 來重新啟用對該會話的消息通知。
發送消息
目前最新版本的 JMessage 支持文字、圖片、語音、位置、文件和自定義幾種類型的消息,基本的用法大家可以直接參考 API 文檔,這里就不再贅述了。
這里需要注意的是 JMessage 提供了兩種創建消息的方式:
兩種方式的結果其實是一樣的,都是返回一條創建好的 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 端開發詳解
知乎專欄:極光日報