1.项目背景
集成环信3.x版本实现类似淘宝发送商品卡片的效果,需要我们手动实现自定义扩展消息。
我使用的环信为3.5.2的版本,应该是几乎当前的最新版本,网上现有的文章或多或少已过时不太适配当前的版本,在我尝试成功后决定记录下整个实现的过程。
最终实现效果为,从商品界面点击【联系卖家】,界面跳转到和卖家的聊天界面,并发送商品信息卡片。
2.实现过程
1.自定义工具类
创建工具类GoodsMessageHelper ,需要定义一些和消息有关的常量以便统一调用,这里实现了isGoodsChatType()函数用于判断一条消息是否是我们自定义的消息。
public class GoodsMessageHelper {
public static String CHATTYPE = "GoodsChatType";
public static String GOODS_ID = "goods_id";
public static String GOODS_NAME = "goods_name";
public static String GOODS_PRICE = "goods_price";
public static String GOODS_PIC = "goods_pic";
public static boolean isGoodsChatType(EMMessage emMessage) {
String TYPE = emMessage.getStringAttribute("CHATTYPE", null);
if (TYPE == null){
return false;
}
if (TYPE.equals(CHATTYPE)){
return true;
}
return false;
}
}
2.发送消息
在EaseChatFragment类的onActivityCreated()方法中,利用商品信息界面传递的标志位来判断是否发送商品信息,该标志位是用于区分从商品界面点过来的聊天窗口和直接从消息列表点进来的聊天窗口。
发送商品消息的方法实现如下,message使用setAttribute(key, value)的方式来传递数据,注意这里我们创建的是Txt文本类型的消息:
protected void sendGoodsMessage(String id, String name, String pic, double price) {
EMMessage message = EMMessage.createTxtSendMessage(name, toChatUsername);
message.setAttribute(GoodsMessageHelper.GOODS_ID, id);
message.setAttribute(GoodsMessageHelper.GOODS_NAME, name);
message.setAttribute(GoodsMessageHelper.GOODS_PIC, pic);
message.setAttribute(GoodsMessageHelper.GOODS_PRICE, String.valueOf(price));
message.setAttribute("CHATTYPE", GoodsMessageHelper.CHATTYPE);
EMClient.getInstance().chatManager().sendMessage(message);
Log.d(TAG, "sendGoodsMessage: 发送商品消息");
}
3.接收消息
找到EaseMessageAdapter类(这个是消息适配器)。
定义两个常量,用于表示消息类型(注意:扩展一种消息类型,需要定义两个常量:接收+发送)
private static final int MESSAGE_TYPE_SENT_GOODS = 14;
private static final int MESSAGE_TYPE_RECV_GOODS = 15;
getViewTypeCount()修改返回的消息类型:+2(每扩展一种消息类型,返回的数值+2)
在getItemViewType()方法中设置返回的消息类型,并把相应数值+2。
需要注意的是,由于我们之前创建的是TXT类型的消息,所以这里是在TXT类型消息的判断下来对我们自定义消息做出处理的。
在createChatRowPresenter()方法中设置呈现消息的类,类GoodsChatRowPresenter由字面意思可理解为消息的呈递者,它的代码将在后续给出
4.显示消息
显示消息首先创建呈递消息所用的GoodsChatRowPresenter类,它实现可参考环信UI中其他Presenter。
在onCreateChatRow()方法中创建显示消息的载体GoodsChatRow,onBubbleClick()方法用于处理该扩展消息的点击事件(例如跳转界面到商品详情页,这里不做具体实现,可根据自己的需求修改)。代码如下:
public class GoodsChatRowPresenter