最近公司项目需要用到环信,早就听说过环信文档写的比较坑,继承过后才发现哪里是坑,简直是无底洞。。。

项目需求是这样的,菜单中有一个房源按钮,点击后弹出房源信息列表,点击列表中的Item将此条Item的概括信息发送个对方。目前环信的消息类型有文本、图片、地理位置、语音视频、红包,提供的已经很全面了,可是我需要像京东、今日头条分享好友似的那种消息类型。所以我们以文本消息为基础,在它上面进行我们的自定义扩展消息。

文档都快翻烂了,还是没找到有价值的资料(文档内容太旧了,好多方法、类都换新了)。没办法,自己翻看环信提供的ChatDemoUi3.0源码和百度资料。皇天不负有心人,终于搞定了。

一、定义字段

首先,定义我们扩展消息需要的字段

public class HouseInfoConstant {public static final String houseInfoExtType = "houseInfoExtType";//房源信息扩展public static final String houseInfoTitle = "houseInfoTitle";//房源标题public static final String houseInfoImgUrl = "houseInfoImgUrl";//房源图片public static final String houseInfoDesc = "houseInfoDesc";//房源信息小文字描述public static final String houseInfoObjectId = "houseInfoObjectId";//房源信息ID
}

这些字段在后面会经常用到,所以提取到一个类中。

二、定义常量

接下来去我们的ChatFragment中定义几个常量

    private static final int REQUEST_CODE_SELECT_HOUSEINFOEXT = 99;private static final int MESSAGE_TYPE_RECV_HOUSEINFOEXT_CALL = 5;private static final int MESSAGE_TYPE_SEND_HOUSEINFOEXT_CALL = 6;private static final int ITEM_HOUSEINFO = 13;

三、注册按钮

在我们的ChatFragment中复写registerExtendMenuItem()方法注册按钮

protected void registerExtendMenuItem() {super.registerExtendMenuItem();inputMenu.registerExtendMenuItem("房源列表", R.mipmap.ic_launcher, ITEM_HOUSEINFO, extendMenuItemClickListener);}

四、绑定菜单按钮点击事件

注册按钮后还要绑定它的点击事件,通过我们的ChatFragment实现EaseChatFragmentHelper接口的onExtendMenuItemClick方法来绑定

我是在setUpView中绑定的这个接口

protected void setUpView() {setChatFragmentHelper(this);super.setUpView();}
public boolean onExtendMenuItemClick(int itemId, View view) {switch (itemId) {case ITEM_HOUSEINFO://房源信息startActivityForResult(new Intent(getActivity(), HouseInfoListActivity.class), REQUEST_CODE_SELECT_HOUSEINFOEXT);break;default:break;}return false;}

五、覆写onActivityResult()方法

通过点击上面的房源列表Item返回我们需要的房源信息,并将这条信息以我们的扩展消息类型发送出去

public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {switch (requestCode) {case REQUEST_CODE_SELECT_HOUSEINFOEXT:if (data != null) {String title = data.getStringExtra("title");String imgUrl = data.getStringExtra("img");String objectId = data.getStringExtra("objectId");String desc = "我在正和兴发现一套不错的房源,推荐你也来看看吧!";EMMessage message = EMMessage.createTxtSendMessage("房源卡片", toChatUsername);message.setAttribute(HouseInfoConstant.houseInfoExtType, true);//设置扩展字段message.setAttribute(HouseInfoConstant.houseInfoTitle, title);//将title设置到扩展字段message.setAttribute(HouseInfoConstant.houseInfoImgUrl, imgUrl);//将imgUrl设置到扩展字段message.setAttribute(HouseInfoConstant.houseInfoObjectId, objectId);//将objectId设置到扩展字段message.setAttribute(HouseInfoConstant.houseInfoDesc, desc);//将desc设置到扩展字段EMClient.getInstance().chatManager().sendMessage(message);}break;}}}

六、定义我们自己的扩展消息提供者CustomChatRowProvider

用来返回我们需要的扩展消息类型载体ChatRow,自定义的ChatRow在后面给出

private final class CustomChatRowProvider implements EaseCustomChatRowProvider {@Overridepublic int getCustomChatRowTypeCount() {return 2;}@Overridepublic int getCustomChatRowType(EMMessage message) {if (message.getType() == EMMessage.Type.TXT) {if (message.getBooleanAttribute(HouseInfoConstant.houseInfoExtType, false)) {return message.direct() == EMMessage.Direct.RECEIVE ? ChatFragment.MESSAGE_TYPE_RECV_HOUSEINFOEXT_CALL : ChatFragment.MESSAGE_TYPE_SEND_HOUSEINFOEXT_CALL;}}return 0;}@Overridepublic EaseChatRowPresenter getCustomChatRow(EMMessage message, int position, BaseAdapter adapter) {if (message.getType() == EMMessage.Type.TXT) {if (message.getBooleanAttribute(HouseInfoConstant.houseInfoExtType, false)) {//发送房源信息卡片return new EaseChatHouseInfoCallPresenter();}}return null;}}

解释一下,getCustomChatRowTypeCount()方法意思我们的新定义了几种消息类型,因为消息有接收方和发送方,所以一种ChatRow对应两种类型。

getCustomChatRowType(EMMessage message),这个方法是获取消息的类型,通过代码也不难看出是判断消息类型是发送还是接收。

getCustomChatRow(EMMessage message, int position, BaseAdapter adapter),获取自定义的ChatRow对象。

七、绑定我们的扩展消息提供者

 @Overridepublic EaseCustomChatRowProvider onSetCustomChatRowProvider() {return new CustomChatRowProvider();}

八、实现自己的ChatRow(重点,这个是核心)

我们扩展消息的载体,可以理解为ListView的Item。没有Item,ListView啥也不是。

public class ChatRowHouseInfo extends EaseChatRow {private TextView title, desc;private ImageView img;public ChatRowHouseInfo(Context context, EMMessage message, int position, BaseAdapter adapter) {super(context, message, position, adapter);}/*填充layout*/@Overrideprotected void onInflateView() {inflater.inflate(message.direct() == EMMessage.Direct.RECEIVE ?R.layout.ease_row_received_houseinfo_call : R.layout.ease_row_send_houseinfo_call, this);}/*查找chatrow中的控件*/@Overrideprotected void onFindViewById() {title = (TextView) findViewById(R.id.house_info_card_title);desc = (TextView) findViewById(R.id.house_info_card_desc);img = (ImageView) findViewById(R.id.house_info_card_img);}/*消息状态改变,刷新listView*/@Overrideprotected void onViewUpdate(EMMessage msg) {adapter.notifyDataSetChanged();}@Overrideprotected void onSetUpView() {EMTextMessageBody textMessageBody = (EMTextMessageBody) message.getBody();message.getStringAttribute(HouseInfoConstant.houseInfoExtType, null);String titleStr = message.getStringAttribute(HouseInfoConstant.houseInfoTitle, null);String descStr = message.getStringAttribute(HouseInfoConstant.houseInfoDesc, null);String imgurlStr = message.getStringAttribute(HouseInfoConstant.houseInfoImgUrl, null);if (!TextUtils.isEmpty(titleStr))title.setText(titleStr);if (!TextUtils.isEmpty(descStr))desc.setText(descStr);ImageLoaderKit.loadImage(imgurlStr, img);}
}

九、包装自定义的ChatRow

public class EaseChatHouseInfoCallPresenter extends EaseChatRowPresenter {@Overrideprotected EaseChatRow onCreateChatRow(Context cxt, EMMessage message, int position, BaseAdapter adapter) {return new ChatRowHouseInfo(cxt, message, position, adapter);}
}

网上的资料都没有这一步骤,都是在扩展消息提供者中直接返回ChatRow实例,我是翻看环信最新Demo源码才搞清楚这里。

十、总结

到这里,自定义扩展消息就完成了,没有文档真心伤不起啊,今晚要加个鸡腿犒劳犒劳自己了。还有,要想实现自定义扩展消息的点击事件的,通过覆写onMessageBubbleClick(EMMessage message)

效果图:

环信3.0自定义扩展消息相关推荐

  1. android 环信消息红点,环信3.0获取会话消息列表

    环信2.0有一个获取消息列表的方法 /*! @method @brief 从数据库中加载消息 @discussion @result 加载的消息列表 */ - (NSArray *)loadAllMe ...

  2. Android环信3.0即时通讯云入门指北

    Android环信3.0即时通讯云入门指北 官方文档 http://docs-im.easemob.com/im/android/sdk/import 基础集成 http://docs-im.ease ...

  3. JavaWeb聊天(Redis+环信) 一、发送接收消息、聊天记录拉取

    公司有需求做一个聊天功能. APP端,跟网页端互相聊天 android端直接嵌入了环信提供的DEMO.聊天记录.都是存储在本地自己进行维护. 所以本次只需要维护网页端的聊天记录~还有接收发送的消息就好 ...

  4. 环信im登录及收发消息

    一.npm 安装Web SDK. npm install easemob-websdk --save 二. 初始化配置 console.log(process.env.IMKEY, '环境变量==== ...

  5. 04环信聊天界面 - 播放语音消息

    分析:需要监听messageLabel的点击事件,然后播放 1.在chatCell里给messageLabel添加点击事件 /*** 初始化*/ -(void)awakeFromNib {// 1.给 ...

  6. 04环信聊天界面 - 发送图片消息和显示图片

    1.在聊天控制器连线 /*** 点击上传图片*/ - (IBAction)showImgPickerAction:(UIButton *)sender {// 图片选择控制器UIImagePicker ...

  7. 环信集成 2---基于环信Demo3.0,实现单聊功能

    这几天在做环信,所以把环信相关的东西拿过来,做个系统点的东西 注意: 这里Demo集成的是带有实时语音功能的(libEaseMobClientSDK.a). 环信库是直接拖拽EaseMobSDK文件夹 ...

  8. iOS开发小记:初次接入环信SDK3.0时遇到的问题及解决办法汇总

    因在开发公司项目有即时通讯模块,经商量之后选择了第三方即时通讯sdk环信,由于3.0文档还不是非常全面,且本人之前没有过开发即时通讯的经验,查阅了很多资料,磕磕绊绊几天终于完成了对该模块的开发,故此记 ...

  9. 环信3.0添加聊天表情包

    前言 最近公司项目集成环信sdk,记录一下集成过程中的各种问题. 如果说现在人与人之间最有效的沟通方式是什么,当然是表情包啊,一套不行就两套,两套不行就十套.本片博客就记录一下环信如何添加表情包. 正 ...

最新文章

  1. Python使用matplotlib进行3D可视化分析:3d柱状图、3d直方图、3d线框图、3d曲面图、3d翼面图(莫比乌斯环)
  2. [zz]Linux操作系统下三种配置环境变量的方法
  3. 查找二叉树(信息学奥赛一本通-T1367)
  4. bash 将二进制转换为十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
  5. HIVE: hive.error.on.empty.partition
  6. SQL函数字符串分拆
  7. Delphi程序结构
  8. 要人帮忙,电脑怎么不寄过来?
  9. JSP期末考试复习习题及答案
  10. ubuntu中颜色拾取器的安装以及16进制ARGB值在线转颜色
  11. Open3D 欧式聚类
  12. P3332 [ZJOI2013]K大数查询
  13. 基于蓝墨云班课的翻转课堂实践
  14. 利用树制作的简易家谱
  15. 社会化分享(附源码)
  16. catia圆角交点如何标注_Catia怎么使用凸台和倒圆角命令?
  17. python统计套利_统计套利——反转定律
  18. 实现用户登录注册代码(高级代码)
  19. 江苏单招C语言试题,2011年对口单招计算机试卷(C语言+原理+电工答案).doc
  20. 智能数据构建与管理(Dataphin)-资产全景

热门文章

  1. APIJson简单使用
  2. FileZilla连接不上ftp服务器
  3. 【Java项目】——基于SpringBoot的用户信息管理系统
  4. zynq中mgtx应用_[ZYNQ入门宝典]GTX高速口带着IBERT一起玩(二)
  5. MacBook pro真的可以做到完全不用鼠标吗?
  6. Topology Shapes of OpenCascade BRep
  7. VScode调试php文件(详细且简单易操作)
  8. APP启动速度慢,如何正确优化?
  9. 怎样扩展摩托罗拉的手机内存
  10. 路由跳转四种方法(带参)