背景
项目中需要实现IM通信功能,其实原来已经继承了云信的视频SDK,而IM模块其实已经在SDK中了,但是由于我们的IM聊天界面是需要自己定制了,因此就加了添加了一个lib-ui的库,方便去自定义IM界面
集成
集成其实很简单,网易提供了两种方式,jar和gradle,毫无疑问gradle
1 | // 基础功能 (必需) |
其中第一个是早就集成了的,自带IM功能,第二第三则是音视频需要的,第四个是需要做聊天记录搜索要用到的
- APPID申请
- 权限
- 初始化
- 前两个看官方文档就可以了,初始化一般就是在主APP的Aplication中进行,代码如下
1 | // 注册通知消息过滤器 |
官方文档和demo中也有说明,需要使用到哪种能力就去初始化哪些,比如该版本还用到了IM的自定义消息,那么也必须在这里进行注册
注意:以上的初始化只能在主线程中进行,为此,云信提供了一个API:NIMUtil.isMainProcess(this)
1 | NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParse()); |
- IM消息监听
1 | // 注册IM消息监听 |
相关概念
- 注册登陆:集成网易云后,需要将本地用户与网易云id关联,每一个用户在网易云有一个唯一的accid和token,对于登陆相当于用户名及密码,对于业务比如:视频/IM则相当与电话号码,你需要和别人通信的时候必须知道对方的accid。
- 用户信息托管:由于本地用户在网易云有一个id关联,那么当要用到网易云的一些能力的时候,我们希望用户的一些基础信息(头像,昵称)是要与本地后端保持一致的。
- 消息锚点:其实就是一个消息对象,它携带了一些时间或者其他信息,方便搜索。
上面两点都是本地后端处理的,前段需要处理的则是,在登陆系统成功后,需要手动调用网易登陆api去帮助用户登陆到网易云,并且监听用户的登陆状态。
1 | public void nimLogin(User user) { |
IM相关
界面
由于lib_neteaseui库提供了界面能力,所以自然自定义界面的话需要集成他的界面,这里有两种方式
- 集成现有类(比如p2pmessage),只需要修改layout,并且传递需要的参数即可。
- 继承SDK中的UI并实现ModuleProxy代理类中方法
开启单聊
很简单直接看代码
1 | IMMessageActivity.start(getContext(), entity.accid, customization, null, IMMessageActivity.class); |
其中,entity.accid代表了对方的号码。
消息面板设置
- 面板类:MessageListPanelEx,这里面封装了发送消息面板的所有功能
- 抽屉:基类BaseAction,比如拍照,相片或者自定义类型都是通过这个基类来实现的。
- IM面板layout:nim_message_activity_text_layout
- 设置用户托管信息:
1 | // 设置网易云用户资料(IM中的头像,昵称等) |
消息设置
- 消息屏蔽:
1 | //屏蔽所有消息 |
- 消息接收
1 | /** |
- 自定义消息
自定义消息比较复杂,参见代码。具体步骤如下:
- 定义消息
1 | /** |
- 自定义消息的基础类
1 | public abstract class CustomAttachment implements MsgAttachment { |
- 自定义消息结构类(用于组装自定义数据)
1 | public class DiagnosisMsg extends CustomAttachment |
- 自定义消息解析类(用于显示自定义消息)
1 | public class CustomAttachParse implements MsgAttachmentParser |
其他
- 注册账号accid网易云强制小写
- 网易云消息从后端还是本地拉取
1 | messageListPanel = new MessageListPanelEx(container, rootView, anchor, false, remote); |
其中最后一个参数remote = true表示从云端拉取数据
- IM聊天点击头像事件
layout:MsgAdapter中layout.nim_message_item
点击事件:NimUIKitImpl.setSessionListener