1 package com.netease.nimlib.sdk.msg;
3 import android.content.Context;
4 import android.net.Uri;
5 import android.text.TextUtils;
35 import org.json.JSONException;
36 import org.json.JSONObject;
39 import java.util.ArrayList;
40 import java.util.List;
76 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
111 return createImageMessage(sessionId, sessionType, file, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
147 return createImageMessage(context,sessionId, sessionType, uri, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
183 return createImageMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
223 return createImageMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
263 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
267 msg.setAttachment(attachment);
312 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
315 msg.setAttachment(attachment);
352 return createAudioMessage(sessionId, sessionType, file, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
392 return createAudioMessage(context,sessionId, sessionType, uri, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
432 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
434 if (duration > 0 && duration < 1000) {
438 msg.setAttachment(attachment);
483 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
485 if (duration > 0 && duration < 1000) {
489 msg.setAttachment(attachment);
530 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
538 msg.setAttachment(location);
588 return createVideoMessage(sessionId, sessionType, file, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
639 @SuppressWarnings(
"java:S107")
641 return createVideoMessage(context,sessionId, sessionType, uri, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
693 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
697 msg.setAttachment(attachment);
756 @SuppressWarnings(
"java:S107")
758 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
761 msg.setAttachment(attachment);
801 return createFileMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
837 return createFileMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
877 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
881 msg.setAttachment(attachment);
926 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
929 msg.setAttachment(attachment);
958 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
997 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
999 msg.setContent(text);
1000 msg.setRobotInfo(messageRobotInfo);
1033 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1035 msg.setRobotInfo(messageRobotInfo);
1150 return createCustomMessage(sessionId, sessionType, content, attachment, config, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
1196 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1198 msg.setContent(content);
1199 if (attachment != null && attachment instanceof
FileAttachment) {
1200 ((FileAttachment) attachment).setNosTokenSceneKey(nosTokenSceneKey);
1202 msg.setAttachment(attachment);
1203 msg.setConfig(config);
1211 if (TextUtils.isEmpty(type) || TextUtils.isEmpty(robotAccount)) {
1212 throw new IllegalArgumentException(
"Invalid param, type and robot account should not be null");
1216 throw new IllegalArgumentException(
"Invalid param, content should not be null");
1218 throw new IllegalArgumentException(
"Invalid param, target should not be null");
1221 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1226 robotAttachment.
initSend(robotAccount, type, content, target, params);
1227 msg.setAttachment(robotAttachment);
1228 msg.setContent(text);
1262 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1264 msg.setAttachment(netCallAttachment);
1299 IMMessageImpl msg =
new IMMessageImpl();
1300 msg.setSessionId(sessionId);
1301 msg.setSessionType(sessionType);
1342 IMMessageImpl forward = ((IMMessageImpl) message).deepClone();
1343 if (forward != null) {
1344 forward.setSessionId(sessionId);
1345 forward.setSessionType(sessionType);
1346 forward.setUuid(StringUtil.get32UUID());
1350 forward.setTime(TimeUtil.currentTimeMillis());
1351 forward.setServerId(0L);
1352 forward.setMessageId(0L);
1354 forward.setMsgAck(
false);
1355 forward.setHasSendAck(
false);
1356 forward.setTeamMsgAckCount(0);
1357 forward.setTeamMsgUnAckCount(0);
1361 if (attachment != null && attachment instanceof
FileAttachment) {
1362 final FileAttachment media = (FileAttachment) attachment;
1363 if (!TextUtils.isEmpty(media.
getUrl())) {
1372 private static IMMessageImpl initSendMessage(String toId,
SessionTypeEnum sessionType) {
1373 IMMessageImpl msg =
new IMMessageImpl();
1375 msg.setUuid(StringUtil.get32UUID());
1376 msg.setSessionId(toId);
1377 msg.setFromAccount(SDKCache.getAccount());
1380 msg.setSessionType(sessionType);
1381 msg.setTime(TimeUtil.currentTimeMillis());
1407 if (messages == null || messages.isEmpty()) {
1410 final String sessionId = messages.get(0).getSessionId();
1411 if (sessionId==null) {
1414 List<IMMessage> msgList =
new ArrayList<>(messages.size());
1417 if (!sessionId.equals(msg.getSessionId())){
1426 return buildHeader(0, msgList.size()) +
"\n" + buildBody(msgList);
1436 private static String buildHeader(
int version,
int message_count) {
1437 JSONObject obj =
new JSONObject();
1439 obj.put(
"version", version);
1441 obj.put(
"terminal", IAuthService.ClientType.Android);
1442 obj.put(
"sdk_version", BuildConfig.VERSION_NAME);
1443 obj.put(
"app_version", BuildConfig.VERSION_CODE);
1444 obj.put(
"message_count", message_count);
1445 }
catch (JSONException e) {
1446 e.printStackTrace();
1448 return obj.toString();
1457 private static String buildBody(@NonNull List<IMMessage> msgList) {
1458 String enter =
"\n";
1459 if (msgList.isEmpty()) {
1462 StringBuilder stringBuilder =
new StringBuilder();
1464 stringBuilder.append(enter).append(MessageConvert.convertMessageToJson(msg));
1466 return stringBuilder.substring(enter.length());
1491 if (TextUtils.isEmpty(json)) {
1494 return MessageConvert.convertJsonToMessage(json);
1521 return MessageConvert.convertMessageToJson(msg);
1552 @androidx.annotation.NonNull
1555 attachment.
setPath(file.getPath());
1556 attachment.
setSize(file.length());
1557 int[] dimension = BitmapDecoder.decodeBound(file);
1561 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1598 @androidx.annotation.NonNull
1603 int[] dimension = BitmapDecoder.decodeBound(context, uri);
1640 @androidx.annotation.NonNull
1643 attachment.
setPath(file.getPath());
1644 attachment.
setSize(file.length());
1646 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1683 @androidx.annotation.NonNull
1734 @androidx.annotation.NonNull
1737 attachment.
setPath(file.getPath());
1738 attachment.
setSize(file.length());
1743 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1792 @androidx.annotation.NonNull
1794 String nosTokenSceneKey) {
1835 @androidx.annotation.NonNull
1838 attachment.
setPath(file.getPath());
1839 attachment.
setSize(file.length());
1841 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1878 @androidx.annotation.NonNull
String getUrl()
获取文件在服务器上的下载url。若文件还未上传,返回null
void setHeight(int height)
设置视频的高度
static IMMessage createNrtcNetcallMessage(String sessionId, SessionTypeEnum sessionType, MsgAttachment netCallAttachment)
创建一条通话记录消息。
.annotation.NonNull static FileAttachment createFileAttachment(Context context, Uri uri, String displayName, String nosTokenSceneKey)
创建文件附件。用于上传文件。
.annotation.NonNull static AudioAttachment createAudioAttachment(Context context, Uri uri, long duration, String nosTokenSceneKey)
创建音频附件。用于上传音频文件。
.annotation.NonNull static FileAttachment createFileAttachment(File file, String displayName, String nosTokenSceneKey)
创建文件附件。用于上传文件。
static IMMessage createAudioMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration, String nosTokenSceneKey)
创建一条语音消息。
static IMMessage createAudioMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri, long duration, String nosTokenSceneKey)
创建一条语音消息。
static long getFileSizeFromUri(Context context, Uri uri)
从URI中获取文件的实际大小
void setWidth(int width)
设置图片宽度
void setExtension(String extension)
设置文件后缀名
boolean setUri(Uri uri)
设置文件uri, 仅支持ContentResolver.SCHEME_FILE类型和ContentResolver.SCHEME_CONTENT类型的uri 仅支持发...
.annotation.NonNull static VideoAttachment createVideoAttachment(File file, long duration, int width, int height, String displayName, String nosTokenSceneKey)
创建视频附件。用于上传视频文件。
云信 IM 消息构造器,提供构建各类型消息的接口。
static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, MsgAttachment attachment)
创建一条自定义消息。
static IMMessage createFileMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName, String nosTokenSceneKey)
创建一条文件消息。
static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, String content, MsgAttachment attachment)
创建一条自定义消息。
static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, String content, MsgAttachment attachment, CustomMessageConfig config)
创建一条自定义消息。
void setLongitude(double longitude)
设置经度
NIM消息实体数据结构。 第三方APP不要调用设置类接口,调用之后不会被持久化
消息本身发送/接收状态,附件状态见AttachStatusEnum
static IMMessage createVideoMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration, int width, int height, String displayName, String nosTokenSceneKey)
创建一条视频消息。
static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file)
创建一条图片消息。
static IMMessage createFileMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName, String nosTokenSceneKey)
创建一条文件消息。
static IMMessage createAudioMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri, long duration)
创建一条语音消息。
static IMMessage createEmptyMessage(String sessionId, SessionTypeEnum sessionType, long time)
创建一条空消息。
.annotation.NonNull static ImageAttachment createImageAttachment(Context context, Uri uri, String displayName, String nosTokenSceneKey)
创建图片附件,用于上传图片文件。
static IMMessage createLocationMessage(String sessionId, SessionTypeEnum sessionType, double lat, double lng, String addr)
创建一条地理位置消息。
.annotation.NonNull static AudioAttachment createAudioAttachment(File file, long duration, String nosTokenSceneKey)
创建音频附件。用于上传音频文件。
.annotation.NonNull static VideoAttachment createVideoAttachment(Context context, Uri uri, long duration, int width, int height, String displayName, String nosTokenSceneKey)
创建视频附件。用于上传视频文件。
void setFromAccount(String account)
设置说话方的帐号。消息方向getDirect()根据改之
static String createForwardMessageListFileDetail(List<? extends IMMessage > messages)
创建多条待合并转发的消息。
void setPath(String path)
设置文件路径
.annotation.NonNull static ImageAttachment createImageAttachment(File file, String displayName, String nosTokenSceneKey)
创建图片附件,用于上传图片文件。
static IMMessage createImageMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName, String nosTokenSceneKey)
创建一条图片消息。
void initSend(String robotAccount, String type, String content, String target, String params)
static IMMessage createVideoMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration, int width, int height, String displayName)
创建一条视频消息。
static IMMessage createAudioMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration)
创建一条语音消息。
static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName, String nosTokenSceneKey)
创建一条图片消息。
void setNosTokenSceneKey(String nosTokenSceneKey)
设置文件上传时的nos scene
String getThumbPathForSave()
获取用于保存缩略图文件的位置
static IMMessage createImageMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName)
创建一条图片消息。
static IMMessage createFileMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName)
创建一条文件消息。
void setDuration(long duration)
设置音频的播放时长
消息的配置选项,主要用于设定消息的声明周期,是否需要推送,是否需要计入未读数等。
void setDisplayName(String displayName)
设置文件显示名
static String convertMessageToJson(IMMessage msg)
将 IMMessage 对象转换成 JSON 格式的字符串。
void setAddress(String address)
设置地理位置描述信息
static String getFileExtensionFromUri(Context context, Uri uri)
从URI中获取文件的扩展名,如果没有则返回空字符串
void setDuration(long duration)
设置视频的播放时长
static IMMessage createTextMessage(String sessionId, SessionTypeEnum sessionType, String text)
创建一条文本消息。
static IMMessage createRobotTextMessage(String sessionId, SessionTypeEnum sessionType, String text, MessageRobotInfo messageRobotInfo)
创建一条机器人普通文本消息。
static IMMessage createFromJson(String json)
创建一条 JSON 消息。
void setLatitude(double latitude)
设置纬度
void setWidth(int width)
设置视频的宽度
MsgTypeEnum getMsgType()
获取消息类型。
static IMMessage createImageMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri)
创建一条图片消息。
static IMMessage createFileMessage(Context context, String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName)
创建一条文件消息。
static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName)
创建一条图片消息。
void setHeight(int height)
设置图片高度
static IMMessage createRobotMessage(String sessionId, SessionTypeEnum sessionType, String robotAccount, String text, String type, String content, String target, String params)
该方法不推荐使用,请使用 MessageBuilder#createRobotTextMessage 和 MessageBuilder#createRobotTipMessag...
static IMMessage createTipMessage(String sessionId, SessionTypeEnum sessionType)
创建一条提醒消息。
static IMMessage createForwardMessage(IMMessage message, String sessionId, SessionTypeEnum sessionType)
创建一条待转发消息。
static IMMessage createRobotTipMessage(String sessionId, SessionTypeEnum sessionType, MessageRobotInfo messageRobotInfo)
创建一条机器人提醒消息。
void setSize(long size)
设置文件大小,单位为byte
static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, String content, MsgAttachment attachment, CustomMessageConfig config, String nosTokenSceneKey)
创建一条自定义消息。