上期我们介绍了Android如何通过Uikit集成单聊模块,第三期视频教程我们将教大家如何通过SDK实现自定义消息。

前期准备

  1. 从官网开发文档自定义消息流程(https://dev.yunxin.163.com/docs/product/IM%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF/SDK%E5%BC%80%E5%8F%91%E9%9B%86%E6%88%90/Android%E5%BC%80%E5%8F%91%E9%9B%86%E6%88%90/%E6%B6%88%E6%81%AF%E6%94%B6%E5%8F%91?#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF)
  2. 参考BBS上如何通过SDK实现类似微信骰子的功能

(https://bbs.yunxin.163.com/forum.php?mod=viewthread&tid=23&highlight=%E9%AA%B0%E5%AD%90)

代码部分

大概思路是这样的

  1. 第一步,定义自定义消息的类型
public interface CustomAttachmentType{int Guess=1;//猜拳int Craps=2;//骰子}
  1. 第二步,定义一个自定义消息附件的基类,负责解析你自定义消息的公用字段,比如类型等

注意: 实现 MsgAttachment 接口的成员都要实现 Serializable。

public abstract class CustomAttachment implements MsgAttachment {protected int type;CustomAttachment(int type) {this.type = type;}public void fromJson(JSONObject data) {if (data != null) {parseData(data);}}@Overridepublic String toJson(boolean send) {return CustomAttachParser.packData(type, packData());}public int getType() {return type;}protected abstract void parseData(JSONObject data);protected abstract JSONObject packData();}
  1. 第三步,继承基类,实现“骰子”附件类型

注意: 成员变量都要实现Serializable。

public class CrapsAttachment extends CustomAttachment{public enum Craps {one(1, "1"),two(2, "2"),three(3, "3"),four(4, "4"),five(5, "5"),six(6, "6"),;private int value;private String desc;Craps(int value, String desc) {this.value = value;this.desc = desc;}static Craps enumOfValue(int value) {for (Craps direction : values()) {if (direction.getValue() == value) {return direction;}}return one;}public int getValue() {return value;}public String getDesc() {return desc;}}private Craps value;public CrapsAttachment() {super(CustomAttachmentType.Craps);random();}@Overrideprotected void parseData(JSONObject data) {value = Craps.enumOfValue(data.getIntValue("value"));}@Overrideprotected JSONObject packData() {JSONObject data = new JSONObject();data.put("value", value.getValue());return data;}private void random() {int value = new Random().nextInt(6) + 1;this.value = Craps.enumOfValue(value);}public Craps getValue() {return value;}}
  1. 第四步,实现自定义消息的附件解析器
public class CustomAttachParser implements MsgAttachmentParser {private static final String KEY_TYPE = "type";private static final String KEY_DATA = "data";@Overridepublic MsgAttachment parse(String json) {CustomAttachment attachment = null;try {JSONObject object = JSON.parseObject(json);int type = object.getInteger(KEY_TYPE);JSONObject data = object.getJSONObject(KEY_DATA);switch (type) {case CustomAttachmentType.Guess:attachment = new GuessAttachment();break;case CustomAttachmentType.Craps:attachment = new CrapsAttachment();break;}if (attachment != null) {attachment.fromJson(data);}} catch (Exception e) {}return attachment;}public static String packData(int type, JSONObject data) {JSONObject object = new JSONObject();object.put(KEY_TYPE, type);if (data != null) {object.put(KEY_DATA, data);}return object.toJSONString();}}
  1. 第五步,将自定义消息展示在UI上(这里简单以文字展示)
public class MsgViewHolderCraps extends MsgViewHolderText{public MsgViewHolderCraps(BaseMultiItemFetchLoadAdapter adapter) {super(adapter);}@Overrideprotected String getDisplayText() {CrapsAttachment crapsAttachment = (CrapsAttachment) message.getAttachment();return crapsAttachment.getValue().getDesc()+"点!";}}
  1. 第六步,发送自定义消息
public class CrapsAction extends BaseAction {public CrapsAction(){super(R.drawable.message_plus_guess_selector, R.string.input_craps);}@Overridepublic void onClick() {CrapsAttachment attachment = new CrapsAttachment();IMMessage message = MessageBuilder.createCustomMessage(getAccount(), getSessionType(), attachment.getValue().getDesc(), attachment);sendMessage(message);}}
  1. 第七步,将附件解析器注册到SDK中,为保证生成历史消息时能够正确解析自定义附件,注册一般放在Applicaton的OnCreate中完成
  2. 第八步,注册扩展消息类型显示的ViewHolder,由于这里使用我们Uikit,所以也需要注册到Application的OnCreate里面
  3. 第九步,添加“骰子”的按钮到“+”中,Demo是在SessionHelper类中定制的单聊界面

注:第七八九三步可以直接一起做,在Application中初始化SessionHelper,然后在SessionHelper中注册解析器以及UI

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// SDK初始化(启动后台服务,若已经存在用户登录信息, SDK 将完成自动登录)NIMClient.init(this, null, null);if(NIMUtil.isMainProcess(this)){//初始化UIKITNimUIKit.init(this);SessionHelper.init();}}}
public class SessionHelper  {private static SessionCustomization p2pCustomization;public static void init(){//解析器NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser());//猜拳的UINimUIKit.registerMsgItemViewHolder(GuessAttachment.class, MsgViewHolderGuess.class);//骰子的uiNimUIKit.registerMsgItemViewHolder(CrapsAttachment.class, MsgViewHolderCraps.class);NimUIKit.setCommonP2PSessionCustomization(getP2pCustomization());}// 定制化单聊界面。如果使用默认界面,返回null即可private static SessionCustomization getP2pCustomization() {if(p2pCustomization == null){p2pCustomization = new SessionCustomization();// 定制加号点开后可以包含的操作, 默认已经有图片,视频等消息了ArrayList<BaseAction> actions = new ArrayList<>();actions.add(new GuessAction());actions.add(new CrapsAction());p2pCustomization.actions = actions;}return p2pCustomization;}}

这里就完美实现了Android自定义消息,赶紧去试试吧~

想看更多集成视频教程,请戳https://netease.im/videoTutorial

网易云信集成视频教程(三):如何通过SDK实现自定义消息?相关推荐

  1. 网易云信集成视频教程(四):如何快速实现iOS登录登出?

    上期我们介绍了如何通过SDK实现自定义消息,第四期视频教程我们将教大家如何快速实现iOS系统下IM登录登出. 第四期 如何快速实现iOS登录登出? 8分钟视频手把手教你接入 文档详解 前期准备 1. ...

  2. 网易云信集成视频教程(一):如何快速实现安卓登录登出?

    由于网易云信稳定.可靠的技术服务以及拥有深厚积淀的行业口碑,越来越多用户集成云信IM和音视频功能.为了提升用户集成效率,我们推出了一系列网易云信集成视频教程,希望帮助用户快速实现功能接入.第一期将为大 ...

  3. 网易云信集成视频教程(六):如何快速实现iOS下IM自定义消息收发?

    第三期视频集成教程中,我们介绍了Android自定义消息的实现,有小伙伴留言问我们会有iOS版本吗,现在iOS版本来了!第六期视频教程我们将教大家如何快速实现iOS下IM自定义消息收发. 第六期 如何 ...

  4. Android 网易云信获取图片,Android 网易云信集成(一)

    网易云信流程与账号管理 关于网易云信的注册还有应用管理就不说了,先说下网易云信的通信流程,只有清楚流程,你才能知道自己要做什么. 先是你的服务器端拿着accid还有其他参数发给网易云信,生成一个tok ...

  5. 网易云信入选《SegmentFault 思否 2019 中国技术品牌影响力企业榜单》!

    近日,SegmentFault 思否作为中国最大的新一代开发者社区,依托数百万开发者用户行为数据,及科技企业技术品牌在国内市场的大数据分析,评选出 30 家在开发者领域最具影响力的科技企业,权威发布& ...

  6. 网易云信IM即时通讯聊天源码SDK 并发高轻松万人并发稳定不丢消息 后端PHP 前端 安卓Java

    优势:承载用户并发同时在线都在第三方网易云信高并发轻松承载万人并发. 开发语言:后端PHP 前端安卓Java 苹果 OC PC端C# 网易云信 IM UIKit是基于 NIM SDK(网易云信 IM ...

  7. 网易云信三周年:我们只做第一

    2018年10月11日,网易旗下的通讯与视频云服务品牌网易云信迎来成立三周年的里程碑.在网易云信内部的三周年特刊中,网易云信总经理阮良表达了对过往三年成绩的回顾以及对未来更为清晰的目标:网易云信只做第 ...

  8. 网易云信SDK遇到的坑

    网易云信最新的4.3的SDK 更新后 需求是在视频通话过程中接入美颜相关功能 大坑啊 我们都知道怎么接入官方提供的api 本地视频前处理 视频前处理,在视频帧发送前对其进行处理,包括美颜,水印,镜像, ...

  9. 无所不在的IM,网易云信潜心为移动社交时代打好地基

    移动社交的赛道上看似风平浪静,实则暗流涌动.在很多业内人士看来,移动社交非但没有萎缩,反而是重要的赛道和风口.近期,网易智慧企业部总经理阮良在接受媒体采访时表示,移动社交的春天正当时,只是这一轮变换了 ...

最新文章

  1. 赋值语句和赋值表达式
  2. 深度讲解:同步/异步/阻塞/非阻塞/BIO/NIO/apr
  3. Python 的文件IO相关操作说明
  4. 如何将SAP Spartacus的默认home页面替换成login页面 - ProtectedRoutesService
  5. mysql数值类型总结及常用函数
  6. window.onscroll
  7. 听红宝书译者谈Web视角下的前端开发
  8. Qt4_Laying Out Widgets Widgets
  9. Sqlite Developer 3.8 破解
  10. 基于MVC模式的超市仓库管理系统的设计与实现
  11. java基础面试题84道
  12. 格式工厂kux格式怎么转换成mp4
  13. win10查看桌面壁纸路径
  14. 抖音超级恶心的滑稽HTML源码
  15. 计算机应用技术毕业后的简历,计算机应用技术毕业生个人简历模板
  16. SpringCloud自定义负载均衡策略--LoadBalancer
  17. C++开发USB时缺少winusb.h头文件
  18. 共建计算产业,共创数智未来
  19. 前端开发技术——对象
  20. Mysql日期的加减法_mysql日期加减

热门文章

  1. 课后作业-结对编程项目总结
  2. vue2.0 练习项目-外卖APP(2)
  3. bzoj1190 [HNOI2007]梦幻岛宝珠 动态规划
  4. 剑指offer面试题15:链表中倒数第K个节点
  5. codevs2574 波兰表达式
  6. Java实战之04JavaWeb-02Request和Response
  7. java中日期类型与字符串相互转换
  8. 关于解决oracle登录:ora-12154:tns:无法解析指定的连接标识符
  9. python 动态类型_python学习--动态类型
  10. linux错误说未声明,如何在Linux 32位计算机上解决REG_EIP未声明(在此函数中首次使用)错误?...