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;
35 import java.util.ArrayList;
36 import java.util.List;
37 import org.json.JSONException;
38 import org.json.JSONObject;
74 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
109 return createImageMessage(sessionId, sessionType, file, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
145 return createImageMessage(context,sessionId, sessionType, uri, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
181 return createImageMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
221 return createImageMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
261 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
265 msg.setAttachment(attachment);
310 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
313 msg.setAttachment(attachment);
350 return createAudioMessage(sessionId, sessionType, file, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
390 return createAudioMessage(context,sessionId, sessionType, uri, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
430 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
432 if (duration > 0 && duration < 1000) {
436 msg.setAttachment(attachment);
481 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
483 if (duration > 0 && duration < 1000) {
487 msg.setAttachment(attachment);
528 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
536 msg.setAttachment(location);
586 return createVideoMessage(sessionId, sessionType, file, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
637 @SuppressWarnings(
"java:S107")
639 return createVideoMessage(context,sessionId, sessionType, uri, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
691 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
695 msg.setAttachment(attachment);
754 @SuppressWarnings(
"java:S107")
756 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
759 msg.setAttachment(attachment);
799 return createFileMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
835 return createFileMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
875 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
879 msg.setAttachment(attachment);
924 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
927 msg.setAttachment(attachment);
956 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
995 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
997 msg.setContent(text);
998 msg.setRobotInfo(messageRobotInfo);
1031 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1033 msg.setRobotInfo(messageRobotInfo);
1148 return createCustomMessage(sessionId, sessionType, content, attachment, config, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
1194 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1196 msg.setContent(content);
1197 if (attachment != null && attachment instanceof
FileAttachment) {
1198 ((FileAttachment) attachment).setNosTokenSceneKey(nosTokenSceneKey);
1200 msg.setAttachment(attachment);
1201 msg.setConfig(config);
1209 if (TextUtils.isEmpty(type) || TextUtils.isEmpty(robotAccount)) {
1210 throw new IllegalArgumentException(
"Invalid param, type and robot account should not be null");
1214 throw new IllegalArgumentException(
"Invalid param, content should not be null");
1216 throw new IllegalArgumentException(
"Invalid param, target should not be null");
1219 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1224 robotAttachment.
initSend(robotAccount, type, content, target, params);
1225 msg.setAttachment(robotAttachment);
1226 msg.setContent(text);
1260 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1262 msg.setAttachment(netCallAttachment);
1297 IMMessageImpl msg =
new IMMessageImpl();
1298 msg.setSessionId(sessionId);
1299 msg.setSessionType(sessionType);
1340 IMMessageImpl forward = ((IMMessageImpl) message).deepClone();
1341 if (forward != null) {
1342 forward.setSessionId(sessionId);
1343 forward.setSessionType(sessionType);
1344 forward.setUuid(StringUtil.get32UUID());
1348 forward.setTime(NtpTimeUtil.getServerNow());
1349 forward.setServerId(0L);
1350 forward.setMessageId(0L);
1352 forward.setMsgAck(
false);
1353 forward.setHasSendAck(
false);
1354 forward.setTeamMsgAckCount(0);
1355 forward.setTeamMsgUnAckCount(0);
1359 if (attachment != null && attachment instanceof
FileAttachment) {
1360 final FileAttachment media = (FileAttachment) attachment;
1361 if (!TextUtils.isEmpty(media.
getUrl())) {
1370 private static IMMessageImpl initSendMessage(String toId,
SessionTypeEnum sessionType) {
1371 IMMessageImpl msg =
new IMMessageImpl();
1373 msg.setUuid(StringUtil.get32UUID());
1374 msg.setSessionId(toId);
1375 msg.setFromAccount(SDKCacheUI.getAccount());
1378 msg.setSessionType(sessionType);
1379 msg.setTime(NtpTimeUtil.getServerNow());
1405 if (messages == null || messages.isEmpty()) {
1408 final String sessionId = messages.get(0).getSessionId();
1409 if (sessionId==null) {
1412 List<IMMessage> msgList =
new ArrayList<>(messages.size());
1415 if (!sessionId.equals(msg.getSessionId())){
1424 return buildHeader(0, msgList.size()) +
"\n" + buildBody(msgList);
1434 private static String buildHeader(
int version,
int message_count) {
1435 JSONObject obj =
new JSONObject();
1437 obj.put(
"version", version);
1439 obj.put(
"terminal", IAuthService.ClientType.Android);
1440 obj.put(
"sdk_version", BuildConfig.VERSION_NAME);
1441 obj.put(
"app_version", BuildConfig.VERSION_CODE);
1442 obj.put(
"message_count", message_count);
1443 }
catch (JSONException e) {
1444 e.printStackTrace();
1446 return obj.toString();
1455 private static String buildBody(@NonNull List<IMMessage> msgList) {
1456 String enter =
"\n";
1457 if (msgList.isEmpty()) {
1460 StringBuilder stringBuilder =
new StringBuilder();
1462 stringBuilder.append(enter).append(MessageConvert.convertMessageToJson(msg, SDKCacheUI.getAccount()));
1464 return stringBuilder.substring(enter.length());
1489 if (TextUtils.isEmpty(json)) {
1492 return MessageConvert.convertJsonToMessage(json, SDKCacheUI.getAccount());
1519 return MessageConvert.convertMessageToJson(msg, SDKCacheUI.getAccount());
1550 @androidx.annotation.NonNull
1553 attachment.
setPath(file.getPath());
1554 attachment.
setSize(file.length());
1555 int[] dimension = BitmapDecoder.decodeBound(file);
1559 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1596 @androidx.annotation.NonNull
1601 int[] dimension = BitmapDecoder.decodeBound(context, uri);
1638 @androidx.annotation.NonNull
1641 attachment.
setPath(file.getPath());
1642 attachment.
setSize(file.length());
1644 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1681 @androidx.annotation.NonNull
1732 @androidx.annotation.NonNull
1735 attachment.
setPath(file.getPath());
1736 attachment.
setSize(file.length());
1741 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1790 @androidx.annotation.NonNull
1792 String nosTokenSceneKey) {
1833 @androidx.annotation.NonNull
1836 attachment.
setPath(file.getPath());
1837 attachment.
setSize(file.length());
1839 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1876 @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)
创建一条自定义消息。