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() {@Overridepublic 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() {@Overridepublic 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 端开发详解
知乎专栏:极光日报

posted on 2017-05-15 16:04 叶祖辉 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/yezuhui/p/6856842.html

JMessage Android 端开发详解相关推荐

  1. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  2. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

  3. 《Android游戏开发详解》一3.1 构造方法

    本节书摘来异步社区<Android游戏开发详解>一书中的第3章,第3.1节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...

  4. 《Android游戏开发详解》一导读

    前 言 Android游戏开发详解 作为对编程知之甚少或者毫无所知的初学者,开始学习Android游戏开发,可能会觉得就像是穿越陌生的星际的旅程.有太多的事情要尝试,太多的知识要学习,令人遗憾的是,还 ...

  5. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  6. NodeJS+Express+mySQL服务端开发详解

    NodeJS+Express+mySQL服务端开发详解 随着NodeJS的发展,现在已经被很多人熟知,NodeJS已经成为了前端开发人员必备的技能.本文不会对NodeJS过多介绍 如果你感兴趣可以访问 ...

  7. 《Android游戏开发详解》——第3章,第3.1节构造方法

    本节书摘来自异步社区<Android游戏开发详解>一书中的第3章,第3.1节构造方法,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区& ...

  8. 《Android游戏开发详解》一2.18 使用Java API中的对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.18节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.1 ...

  9. 《Android游戏开发详解》——第2章,第2.10节使用对象

    本节书摘来自异步社区<Android游戏开发详解>一书中的第2章,第2.10节使用对象,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区 ...

最新文章

  1. 大盘点 | 2020年5篇目标检测算法最佳综述
  2. Hadoop学习笔记(1)
  3. 多个独立的forEach循环, 内部处理条件是一样,代码优化方案
  4. python安装redis库
  5. serv-u 数据备份_如何使用用户数据脚本在EC2实例上安装Apache Web Server
  6. Hadoop无法上传文件查找原因
  7. win10计算机变成了英文,win10变成英文【处理方式】
  8. nodejs爬虫实战_实战nodejs写网络爬虫
  9. 滴水石穿,奇迹是一点点实现的
  10. Word毕业论文排版 公式居中 编号右对齐 及交叉引用(使用MathType公式编辑器实现)
  11. 2012年部分节假日安排
  12. 区块链技术在物联网中的应用概述
  13. 中式红木装修,古雅灵动、温婉雅致、独具风情
  14. oracle awr 执行计划,AWR(五)-利用AWR生成SQL执行计划(SQLREPORT)并进行优化 | 信春哥,系统稳,闭眼上线不回滚!...
  15. 最新版大学英语六级词汇打印版
  16. 等差数列java_java简单的编程(等差数列)
  17. 旧时光的伤感日志:我们的转身,泪倾城
  18. python实现cnn特征提取_使用PyTorch提取CNNs图像特征
  19. 华硕n54u mysql_改版华硕[N14U N54U]5G 2G的7620老毛子Padavan固件开启frp教程
  20. 学习游戏建模的话,还不清楚电脑配置需要什么样的吗?「部分」

热门文章

  1. Careercup | Chapter 1
  2. 有关import sun.audio.AudioPlayer(或者其它文件)的问题
  3. 第十四章 梁山好汉中谁最惹人爱
  4. 第三话 开关说它不认识“2”
  5. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“
  6. python生成指定长度的列表_python – 如何将列表或字符串解析为固定长度的块
  7. 蓝牙MESH网关_水哥智能教学视频一米家蓝牙mesh设备如何升级固件
  8. windows命令大全_必收藏!电脑快捷键、组合键大全
  9. android 触摸 卡顿,Android CoordinatorLayout(五) 严重的卡顿BUG
  10. 深圳大学梁臻博士提出EEGFuseNet高维脑电图混合无监督深度特征表征与融合模型及其在情绪识别中的应用...