跳转至

消息发送

消息可以通过两种默认方法发送,这两种方法的效果是一样的,两种方式以文本消息为例。

文本消息

方法一 :

参数说明:

参数 说明
conversationType 会话类型
targetId 目标 Id。根据不同的 conversationType,可能是用户 Id、群组 Id 或聊天室 Id。
textMessage 消息内容
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMessageCallback() 发送消息的回调

示例代码:

// 构建文本消息实例
TextMessage textMessage = TextMessage.obtain("我是消息内容");
/**
 * 根据会话类型,发送消息。
 */
RongIMClient.getInstance().sendMessage(conversationType, targetId, textMessage, null, null, new IRongCallback.ISendMessageCallback() {
    @Override
    public void onAttached(Message message) {
        // 消息成功存到本地数据库的回调
    }

    @Override
    public void onSuccess(Message message) {
        // 消息发送成功的回调
    }

    @Override
    public void onError(Message message, RongIMClient.ErrorCode errorCode) {
        // 消息发送失败的回调
    }
});

方法二 :

message 参数说明:

参数 说明
targetId 目标 Id
conversationType 会话类型
textMessage 消息内容

发送参数说明:

参数 说明
message 会话类型
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMessageCallback() 发送消息的回调

示例代码:

// 构造 TextMessage 实例
TextMessage myTextMessage = TextMessage.obtain("我是消息内容");

/* 生成 Message 对象。
 */
Message myMessage = Message.obtain("7127", Conversation.ConversationType.PRIVATE, myTextMessage);

/**
 * 发送消息。
 */
RongIMClient.getInstance().sendMessage(myMessage, null, null, new IRongCallback.ISendMessageCallback() {
  @Override
  public void onAttached(Message message) {
    //消息本地数据库存储成功的回调
  }

  @Override
  public void onSuccess(Message message) {
    //消息通过网络发送成功的回调
  }

  @Override
  public void onError(Message message, RongIMClient.ErrorCode errorCode) {
    //消息发送失败的回调
  }
});

图片消息

导引

发送图片消息,可以选择使用默认发送,也可以选择发送到自己服务器;如图:

ImageMessage 参数说明:

参数 说明
thumUri 缩略图地址
localUri 大图地址
isFull 是否发送原图。

默认发送方式:

参数说明:

参数 说明
conversationType 会话类型
targetId 目标 Id。根据不同的 conversationType,可能是用户 Id、群组 Id 或聊天室 Id。
imgMsg 消息内容
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
RongIMClient.SendImageMessageCallback() 回调
示例代码:
/**
 * 生成ImageMessage对象。
 */
ImageMessage myImageMessage = ImageMessage.obtain(thumUri,localUri,true);
  /**
 * 根据会话类型,发送图片消息。
 */
RongIMClient.getInstance().sendImageMessage(conversationType, targetId, imgMsg, pushContent, pushData, new RongIMClient.SendImageMessageCallback() {

        @Override
        public void onAttached(Message message) {
                //保存数据库成功
        }

        @Override
        public void onError(Message message, RongIMClient.ErrorCode code) {
                //发送失败
        }

        @Override
        public void onSuccess(Message message) {
                //发送成功
        }

        @Override
        public void onProgress(Message message, int progress) {
                //发送进度
        }
});

发送到自己服务器方式:

参数说明:

参数 说明
conversationType 会话类型
targetId 目标 Id。根据不同的 conversationType,可能是用户 Id、群组 Id 或聊天室 Id。
imgMsg 消息内容
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
RongIMClient.SendImageMessageWithUploadListenerCallback() 回调

示例代码:

/**
 * 生成ImageMessage对象。
 */
ImageMessage myImageMessage = ImageMessage.obtain(thumUri,localUri,true);
  /**
 * 根据会话类型,发送图片消息。
 */
RongIMClient.getInstance().sendImageMessage(conversationType, targetId, imgMsg, pushContent, pushData, new RongIMClient. new RongIMClient.SendImageMessageWithUploadListenerCallback() {
     @Override
     public void onAttached(Message message, final RongIMClient.UploadImageStatusListener uploadImageStatusListener) {
         /*上传图片到自己的服务器*/
         uploadImg(imgMsg.getPicFilePath(), new UploadListener() {
             @Override
             public void onSuccess(String url) {
              
             }


             @Override
             public void onProgress(float progress) {
                
             }


             @Override
             public void onFail() {
           
             }
         });

文件消息

导引

发送文件消息,可以选择使用默认发送,也可以选择发送到自己服务器;如图:

message 参数说明:

参数 说明
conversationType 会话类型
targetId 目标id
fileMessage 文件信息

默认发送方式:

参数说明:

参数 说明
message 发送的信息
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMediaMessageCallback 回调

示例代码:

/**
 * 生成FileMessage对象。
 */
FileMessage fileMessage = FileMessage.obtain(url);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, fileMessage);
  /**
 * 根据会话类型
 */
RongIMClient.getInstance(). sendMediaMessage( message, pushContent,  pushData, new IRongCallback.ISendMediaMessageCallback callback){
         @Override
        public void onProgress(Message message, int progress);

        @Override
        public  void onCanceled(Message message);
};

发送到自己服务器方式:

参数说明:

参数 说明
message 发送的信息
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMediaMessageCallbackWithUploader 回调

示例代码:

/**
 * 生成FileMessage对象。
 */
FileMessage fileMessage = FileMessage.obtain(url);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, fileMessage);
  /**
 * 根据会话类型
 */
RongIMClient.getInstance().sendMediaMessage(message, pushContent, pushData, new IRongCallback.ISendMediaMessageCallbackWithUploader callback){
         /**
         * 消息已存储数据库。
         */
        void onAttached(Message message, MediaMessageUploader uploader);

        /**
         * 媒体文件上传进度。
         */
        void onProgress(Message message, int progress);

        /**
         * 消息发送成功。
         */
        void onSuccess(Message message);

        /**
         * 消息发送失败。
         */
        void onError(Message message, RongIMClient.ErrorCode errorCode);

        /**
         * 消息被取消发送。
         */
        void onCanceled(Message message);
};

图文消息

RichContentMessage 参数说明:

参数 说明
title 消息标题
content 消息内容
imageUrl 消息图片url.

参数说明:

参数 说明
message 消息内容
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMessageCallback() 回调

示例代码:

/**
 * 生成RichContentMessage对象。
 */
RichContentMessage richContentMessage = RichContentMessage.obtain("标题", "内容", "http://rongcloud.cn/images/logo.png");

//"9517" 为目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
//Conversation.ConversationType.PRIVATE 为会话类型。
Message myMessage = Message.obtain("9517", Conversation.ConversationType.PRIVATE, richContentMessage);
  /**
 * 根据会话类型,发送位置消息
 */
RongIMClient.getInstance().sendLocationMessage(message, pushContent, pushData, new IRongCallback.ISendMessageCallback(){
  @Override
  public void onAttached(Message message) {

  }

  @Override
  public void onSuccess(Message message) {

  }

  @Override
  public void onError(Message message, RongIMClient.ErrorCode errorCode) {

  }
});

位置消息

LocationMessage 参数说明:

参数 说明
lat 纬度
lng 经度
poi信息 poi信息
imgUri 地图缩率图地址

参数说明:

参数 说明
message 消息内容
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMessageCallback() 回调

示例代码:

/**
 * 生成LocationMessage对象。
 */
LocationMessage locationMessage = LocationMessage.obtain(lat, lng, poi, thumb);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, locationMessage);
  /**
 * 根据会话类型,发送位置消息
 */
RongIMClient.getInstance().sendLocationMessage(message, pushContent, pushData, new IRongCallback.ISendMessageCallback(){
  @Override
  public void onAttached(Message message) {

  }

  @Override
  public void onSuccess(Message message) {

  }

  @Override
  public void onError(Message message, RongIMClient.ErrorCode errorCode) {

  }
});

视频消息

注意

必须在初始化之后调用 RongIMClient.registerMessageType(SightMessage.class); 进行注册;

message 参数说明:

参数 说明
conversationType 会话类型
targetId 目标id
fileMessage 文件信息

默认发送方式:

参数说明:

参数 说明
message 发送的信息
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMediaMessageCallback 回调

示例代码:

        /**
         * 生成SightMessage对象。
         */
SightMessage sightMessage = SightMessage.obtain(url,url,duration);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, sightMessage);
        /**
         * 根据会话类型
         */
RongIMClient.getInstance(). sendMediaMessage( message, pushContent,  pushData, new IRongCallback.ISendMediaMessageCallback callback){
            @Override
            public void onProgress(Message message, int progress);

            @Override
            public  void onCanceled(Message message);
        };

发送到自己服务器方式:

参数说明:

参数 说明
message 发送的信息
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMediaMessageCallbackWithUploader 回调

示例代码:

       /**
         * 生成SightMessage对象。
         */
SightMessage sightMessage = SightMessage.obtain(url,url,duration);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, sightMessage);
  /**
 * 根据会话类型
 */
RongIMClient.getInstance().sendMediaMessage(message, pushContent, pushData, new IRongCallback.ISendMediaMessageCallbackWithUploader callback){
         /**
         * 消息已存储数据库。
         */
        void onAttached(Message message, MediaMessageUploader uploader);

        /**
         * 媒体文件上传进度。
         */
        void onProgress(Message message, int progress);

        /**
         * 消息发送成功。
         */
        void onSuccess(Message message);

        /**
         * 消息发送失败。
         */
        void onError(Message message, RongIMClient.ErrorCode errorCode);

        /**
         * 消息被取消发送。
         */
        void onCanceled(Message message);
};

命令消息

CommandMessage参数说明

参数 类型 说明
name String 获取命令名
data String 设置命令数据,可以为任意格式,如 JSON。

参数说明:

参数 说明
message 消息内容
pushContent 当下发 push 消息时,在通知栏里会显示这个字段
pushData push 附加信息
IRongCallback.ISendMessageCallback() 回调

示例代码:

CommandMessage commandMessage = CommandMessage.obtain(name,data);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, locationMessage);
RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
  @Override
  public void onAttached(Message message) {
    //消息本地数据库存储成功的回调
  }

  @Override
  public void onSuccess(Message message) {
    //消息通过网络发送成功的回调
  }

  @Override
  public void onError(Message message, RongIMClient.ErrorCode errorCode) {
    //消息发送失败的回调
  }
});

自定义消息

1、继承 MessageContent

新建自定义消息类,继承 MessageContent 如下面示例代码:

public class CustomizeMessage extends MessageContent {
      private String content;//消息属性,可随意定义
  }

2、重写和实现方法

实现 encode() 方法,该方法的功能是将消息属性封装成 json 串,再将 json 串转成 byte 数组,encode()会在发消息时调用,如下面示例代码:

示例代码

@Override
public byte[] encode() {
    JSONObject jsonObj = new JSONObject();

    try {
        jsonObj.put("content", "这是一条消息内容");
    } catch (JSONException e) {
        Log.e("JSONException", e.getMessage());
    }

    try {
        return jsonObj.toString().getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return null;
}

覆盖父类的 MessageContent(byte[] data) 构造方法,该方法将对收到的消息进行解析,先由 byte 转成 json 字符串,再将 json 中内容取出赋值给消息属性。

示例代码

public CustomizeMessage(byte[] data) {
    String jsonStr = null;

    try {
        jsonStr = new String(data, "UTF-8");
    } catch (UnsupportedEncodingException e1) {

    }

    try {
        JSONObject jsonObj = new JSONObject(jsonStr);

        if (jsonObj.has("content"))
            content = jsonObj.optString("content");

    } catch (JSONException e) {
        RLog.e(this, "JSONException", e.getMessage());
    }

}

MessageContent 已实现 Parcelable 接口,下面需要实现 Parcelable 中的方法:

示例代码

//给消息赋值。
public CustomizeMessage(Parcel in) {
    content=ParcelUtils.readFromParcel(in);//该类为工具类,消息属性
    ...
    //这里可继续增加你消息的属性
  }

  /**
   * 读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。
   */
  public static final Creator<CustomizeMessage> CREATOR = new Creator<CustomizeMessage>() {

      @Override
      public CustomizeMessage createFromParcel(Parcel source) {
          return new CustomizeMessage(source);
      }

      @Override
      public CustomizeMessage[] newArray(int size) {
          return new CustomizeMessage[size];
      }
  };

  /**
   * 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。
   *
   * @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。
   */
  public int describeContents() {
      return 0;
  }

  /**
   * 将类的数据写入外部提供的 Parcel 中。
   *
   * @param dest  对象被写入的 Parcel。
   * @param flags 对象如何被写入的附加标志。
   */
  @Override
  public void writeToParcel(Parcel dest, int flags) {
      ParcelUtils.writeToParcel(dest, content);//该类为工具类,对消息中属性进行序列化
      ...
      //这里可继续增加你消息的属性
  }

3、增加注解信息

注解名:MessageTag ;属性:value ,flag; value 即 ObjectName 是消息的唯一标识不可以重复,且三端必须一致。开发者命名时不能以 RC 开头,避免和融云内置消息冲突;flag 是用来定义消息的可操作状态。

如下面代码段,自定义消息名称 CustomizeMessage ,vaule 是 app:custom ,flag 是 MessageTag.ISCOUNTED | MessageTag.ISPERSISTED表示消息计数且存库。

示例代码

@MessageTag(value = "app:custom", flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED)
public class CustomizeMessage extends MessageContent {
  ...
}

flag 值如下表:

枚举值 说明
MessageTag.NONE 为空值,不表示任何意义,发送的自定义消息不会在会话页面和会话列表中展示。
MessageTag.ISCOUNTED 表示客户端收到消息后,要进行未读消息计数(未读消息数增加 1),所有内容型消息都应该设置此值。非内容类消息暂不支持消息计数。
MessageTag.ISPERSISTED 表示客户端收到消息后,要进行存储,并在之后可以通过接口查询,存储后会在会话界面中显示。

4、注册自定义消息

自定义消息应在 init 后注册,代码如下:

RongIMClient.registerMessageType(CustomizeMessage.class);

正在输入消息

导引

该功能只支持单聊

发送正在输入的状态。

参数说明

参数 类型 说明
conversationType Conversation.ConversationType 会话类型
targetId String 目标id
typingContentType String 正在输入的消息的类型名。

示例代码

RongIMClient.getInstance().sendTypingStatus(mCurrentConversation.getConversationType(),
      mCurrentConversation.getTargetId(), objectName);

在接收端,您可以设置输入状态的监听器。

回调方法说明

方法名 说明
onTypingStatusChanged 正在输入的用户有变化

示例代码

RongIMClient.setTypingStatusListener(new RongIMClient.TypingStatusListener() {
    @Override
    public void onTypingStatusChanged(Conversation.ConversationType type, String targetId, Collection<TypingStatus> typingStatusSet) {
        
    }
});