Android 环信IM即时通讯 自定义扩展消息 注意点

android 自定义扩展消息

1.创建自定义扩展消息字段:

Android 环信IM即时通讯 自定义扩展消息 注意点

2.创建自定义扩展消息实例:(并创建get/set)

Android 环信IM即时通讯 自定义扩展消息 注意点


3.那么接下来我们需要到chatFragment里面去注册这个按钮创建一个触发事件:

先去定义几个常量在chatFragment里面定义好之后:

Android 环信IM即时通讯 自定义扩展消息 注意点

那么接下来我们需要到chatFragment里面去注册这个按钮:

Android 环信IM即时通讯 自定义扩展消息 注意点


然后,我们需要到onExtendMenuItemClick这个方法中写名片按钮的点击事件:

Android 环信IM即时通讯 自定义扩展消息 注意点

大家看到了是个startActivityForResult,看到这里,肯定接下来就是去到REQUEST_CODE_SELECT_ADMIN_MESSAGE里面接收data:
Android 环信IM即时通讯 自定义扩展消息 注意点


接下来我们需要去CustomChatRowProvider这个内部类里面去设置发送接收,大家需要注意getCustomChatRowTypeCount(){}方法里面必须要加上2,这个2的意思就是说发送和接收系统通知(会在后面解释为什么需要加上2):

Android 环信IM即时通讯 自定义扩展消息 注意点

接下来这个非常重要,这个是系统通知消息的ChatRow,就是载体

Android 环信IM即时通讯 自定义扩展消息 注意点

4.new一个chatRow出来,这个chatRow在easeui里面是没有的,所以需要我们自己写

Android 环信IM即时通讯 自定义扩展消息 注意点Android 环信IM即时通讯 自定义扩展消息 注意点Android 环信IM即时通讯 自定义扩展消息 注意点

这里设置完了之后,基本上就好了,布局我没有放出来,等会看运行之后的效果

贴上判断是否是系统通知方法。可以自己定义


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里面去注册这个按钮创建一个触发事件: