1 package com.netease.nimlib.sdk.msg;
3 import android.content.Context;
4 import android.net.Uri;
5 import android.text.TextUtils;
6 import androidx.annotation.NonNull;
34 import java.util.ArrayList;
35 import java.util.List;
36 import org.json.JSONException;
37 import org.json.JSONObject;
73 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
108 return createImageMessage(sessionId, sessionType, file, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
144 return createImageMessage(context,sessionId, sessionType, uri, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
180 return createImageMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
220 return createImageMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
260 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
264 msg.setAttachment(attachment);
309 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
312 msg.setAttachment(attachment);
349 return createAudioMessage(sessionId, sessionType, file, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
389 return createAudioMessage(context,sessionId, sessionType, uri, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
429 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
431 if (duration > 0 && duration < 1000) {
435 msg.setAttachment(attachment);
480 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
482 if (duration > 0 && duration < 1000) {
486 msg.setAttachment(attachment);
527 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
535 msg.setAttachment(location);
585 return createVideoMessage(sessionId, sessionType, file, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
636 @SuppressWarnings(
"java:S107")
638 return createVideoMessage(context,sessionId, sessionType, uri, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
690 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
694 msg.setAttachment(attachment);
753 @SuppressWarnings(
"java:S107")
755 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
758 msg.setAttachment(attachment);
798 return createFileMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
834 return createFileMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
874 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
878 msg.setAttachment(attachment);
923 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
926 msg.setAttachment(attachment);
955 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
994 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
996 msg.setContent(text);
997 msg.setRobotInfo(messageRobotInfo);
1030 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1032 msg.setRobotInfo(messageRobotInfo);
1147 return createCustomMessage(sessionId, sessionType, content, attachment, config, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
1193 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1195 msg.setContent(content);
1196 if (attachment != null && attachment instanceof
FileAttachment) {
1197 ((FileAttachment) attachment).setNosTokenSceneKey(nosTokenSceneKey);
1199 msg.setAttachment(attachment);
1200 msg.setConfig(config);
1208 if (TextUtils.isEmpty(type) || TextUtils.isEmpty(robotAccount)) {
1209 throw new IllegalArgumentException(
"Invalid param, type and robot account should not be null");
1213 throw new IllegalArgumentException(
"Invalid param, content should not be null");
1215 throw new IllegalArgumentException(
"Invalid param, target should not be null");
1218 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1223 robotAttachment.
initSend(robotAccount, type, content, target, params);
1224 msg.setAttachment(robotAttachment);
1225 msg.setContent(text);
1259 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1261 msg.setAttachment(netCallAttachment);
1296 IMMessageImpl msg =
new IMMessageImpl();
1297 msg.setSessionId(sessionId);
1298 msg.setSessionType(sessionType);
1339 IMMessageImpl forward = ((IMMessageImpl) message).deepClone();
1340 if (forward != null) {
1341 forward.setSessionId(sessionId);
1342 forward.setSessionType(sessionType);
1343 forward.setUuid(StringUtil.get32UUID());
1347 forward.setTime(TimeUtil.currentTimeMillis());
1348 forward.setServerId(0L);
1349 forward.setMessageId(0L);
1351 forward.setMsgAck(
false);
1352 forward.setHasSendAck(
false);
1353 forward.setTeamMsgAckCount(0);
1354 forward.setTeamMsgUnAckCount(0);
1358 if (attachment != null && attachment instanceof
FileAttachment) {
1359 final FileAttachment media = (FileAttachment) attachment;
1360 if (!TextUtils.isEmpty(media.
getUrl())) {
1369 private static IMMessageImpl initSendMessage(String toId,
SessionTypeEnum sessionType) {
1370 IMMessageImpl msg =
new IMMessageImpl();
1372 msg.setUuid(StringUtil.get32UUID());
1373 msg.setSessionId(toId);
1374 msg.setFromAccount(SDKCacheUI.getAccount());
1377 msg.setSessionType(sessionType);
1378 msg.setTime(TimeUtil.currentTimeMillis());
1404 if (messages == null || messages.isEmpty()) {
1407 final String sessionId = messages.get(0).getSessionId();
1408 if (sessionId==null) {
1411 List<IMMessage> msgList =
new ArrayList<>(messages.size());
1414 if (!sessionId.equals(msg.getSessionId())){
1423 return buildHeader(0, msgList.size()) +
"\n" + buildBody(msgList);
1433 private static String buildHeader(
int version,
int message_count) {
1434 JSONObject obj =
new JSONObject();
1436 obj.put(
"version", version);
1438 obj.put(
"terminal", IAuthService.ClientType.Android);
1439 obj.put(
"sdk_version", BuildConfig.VERSION_NAME);
1440 obj.put(
"app_version", BuildConfig.VERSION_CODE);
1441 obj.put(
"message_count", message_count);
1442 }
catch (JSONException e) {
1443 e.printStackTrace();
1445 return obj.toString();
1454 private static String buildBody(@NonNull List<IMMessage> msgList) {
1455 String enter =
"\n";
1456 if (msgList.isEmpty()) {
1459 StringBuilder stringBuilder =
new StringBuilder();
1461 stringBuilder.append(enter).append(MessageConvert.convertMessageToJson(msg, SDKCacheUI.getAccount()));
1463 return stringBuilder.substring(enter.length());
1488 if (TextUtils.isEmpty(json)) {
1491 return MessageConvert.convertJsonToMessage(json, SDKCacheUI.getAccount());
1518 return MessageConvert.convertMessageToJson(msg, SDKCacheUI.getAccount());
1549 @androidx.annotation.NonNull
1552 attachment.
setPath(file.getPath());
1553 attachment.
setSize(file.length());
1554 int[] dimension = BitmapDecoder.decodeBound(file);
1558 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1595 @androidx.annotation.NonNull
1600 int[] dimension = BitmapDecoder.decodeBound(context, uri);
1637 @androidx.annotation.NonNull
1640 attachment.
setPath(file.getPath());
1641 attachment.
setSize(file.length());
1643 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1680 @androidx.annotation.NonNull
1731 @androidx.annotation.NonNull
1734 attachment.
setPath(file.getPath());
1735 attachment.
setSize(file.length());
1740 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1789 @androidx.annotation.NonNull
1791 String nosTokenSceneKey) {
1832 @androidx.annotation.NonNull
1835 attachment.
setPath(file.getPath());
1836 attachment.
setSize(file.length());
1838 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1875 @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 String createForwardMessageListFileDetail(List<?extends IMMessage > messages)
创建多条待合并转发的消息。
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()根据改之
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)
创建一条自定义消息。