Android 环信IM即时通讯 自定义扩展消息 注意点
android 自定义扩展消息
1.创建自定义扩展消息字段:
2.创建自定义扩展消息实例:(并创建get/set)
3.那么接下来我们需要到chatFragment里面去注册这个按钮创建一个触发事件:
先去定义几个常量在chatFragment里面定义好之后:
那么接下来我们需要到chatFragment里面去注册这个按钮:
然后,我们需要到onExtendMenuItemClick这个方法中写名片按钮的点击事件:
大家看到了是个startActivityForResult,看到这里,肯定接下来就是去到REQUEST_CODE_SELECT_ADMIN_MESSAGE里面接收data:
接下来我们需要去CustomChatRowProvider这个内部类里面去设置发送接收,大家需要注意getCustomChatRowTypeCount(){}方法里面必须要加上2,这个2的意思就是说发送和接收系统通知(会在后面解释为什么需要加上2):
接下来这个非常重要,这个是系统通知消息的ChatRow,就是载体
4.new一个chatRow出来,这个chatRow在easeui里面是没有的,所以需要我们自己写
这里设置完了之后,基本上就好了,布局我没有放出来,等会看运行之后的效果
贴上判断是否是系统通知方法。可以自己定义
public static boolean isAdminMessage(EMMessage emMessage){ String Type = emMessage.getStringAttribute(AdminRawModel.adminExtType,null); if (Type == null){ return false; } if (Type.equals("adminExtType")){ return true; } return false; }
5.在easeui库中找的EaseMessageAdapter类(这个是消息适配器)。
定义两个常量,用于表示消息类型(注意:扩展一种消息类型,需要定义两个常量:接收+发送 定义的常量数值不能超出定义的常量数量太多否者会报数组越界错)):
private static final int MESSAGE_TYPE_SENT_ADMINMESSAGE = 14; private static final int MESSAGE_TYPE_RECV_ADMINMESSAGE = 15;
getViewTypeCount()修改返回的消息类型:+2(每扩展一种消息类型,返回的数值+2)
那么接下来我们需要到chatFragment里面去注册这个按钮创建一个触发事件:
public int getViewTypeCount() { if(customRowProvider != null && customRowProvider.getCustomChatRowTypeCount() > 0){ return customRowProvider.getCustomChatRowTypeCount() + 16; } return 16; }
在getItemViewType()方法中设置返回的消息类型,并+2:
/** * get type of item */ public int getItemViewType(int position) { EMMessage message = getItem(position); if (message == null) { return -1; } if(customRowProvider != null && customRowProvider.getCustomChatRowType(message) > 0){ return customRowProvider.getCustomChatRowType(message) + 15; } if (message.getType() == EMMessage.Type.TXT) { if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){ return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_EXPRESSION : MESSAGE_TYPE_SENT_EXPRESSION; }else if(message.getBooleanAttribute(AdminRawModel.adminExtType,false)){ return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_ADMINMESSAGE : MESSAGE_TYPE_SENT_ADMINMESSAGE; } return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_TXT : MESSAGE_TYPE_SENT_TXT; } if (message.getType() == EMMessage.Type.IMAGE) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_IMAGE : MESSAGE_TYPE_SENT_IMAGE; } if (message.getType() == EMMessage.Type.LOCATION) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_LOCATION : MESSAGE_TYPE_SENT_LOCATION; } if (message.getType() == EMMessage.Type.VOICE) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VOICE : MESSAGE_TYPE_SENT_VOICE; } if (message.getType() == EMMessage.Type.VIDEO) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VIDEO : MESSAGE_TYPE_SENT_VIDEO; } if (message.getType() == EMMessage.Type.FILE) { return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_FILE : MESSAGE_TYPE_SENT_FILE; } return -1;// invalid }
在createChatRow()方法中设置消息的类:
protected EaseChatRow createChatRow(Context context, EMMessage message, int position) { EaseChatRow chatRow = null; if(customRowProvider != null && customRowProvider.getCustomChatRow(message, position, this) != null){ return customRowProvider.getCustomChatRow(message, position, this); } switch (message.getType()) { case TXT: if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){ chatRow = new EaseChatRowBigExpression(context, message, position, this); }else if(message.getBooleanAttribute(AdminRawModel.adminExtType, false)){ chatRow = new AdminMessageRow(context, message, position, this); }else{ chatRow = new EaseChatRowText(context, message, position, this); } break; case LOCATION: chatRow = new EaseChatRowLocation(context, message, position, this); break; case FILE: chatRow = new EaseChatRowFile(context, message, position, this); break; case IMAGE: chatRow = new EaseChatRowImage(context, message, position, this); break; case VOICE: chatRow = new EaseChatRowVoice(context, message, position, this); break; case VIDEO: chatRow = new EaseChatRowVideo(context, message, position, this); break; default: break; } return chatRow; }
到此已经完成了扩展消息的开发。
那么接下来我们需要到chatFragment里面去注册这个按钮创建一个触发事件: