1 package com.netease.nimlib.sdk.msg;
3 import android.content.Context;
4 import android.net.Uri;
5 import android.text.TextUtils;
36 import org.json.JSONException;
37 import org.json.JSONObject;
40 import java.util.ArrayList;
41 import java.util.List;
77 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
112 return createImageMessage(sessionId, sessionType, file, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
148 return createImageMessage(context,sessionId, sessionType, uri, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
184 return createImageMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
224 return createImageMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
264 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
268 msg.setAttachment(attachment);
313 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
316 msg.setAttachment(attachment);
353 return createAudioMessage(sessionId, sessionType, file, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
393 return createAudioMessage(context,sessionId, sessionType, uri, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
433 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
435 if (duration > 0 && duration < 1000) {
439 msg.setAttachment(attachment);
484 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
486 if (duration > 0 && duration < 1000) {
490 msg.setAttachment(attachment);
531 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
539 msg.setAttachment(location);
589 return createVideoMessage(sessionId, sessionType, file, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
640 @SuppressWarnings(
"java:S107")
642 return createVideoMessage(context,sessionId, sessionType, uri, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
694 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
698 msg.setAttachment(attachment);
757 @SuppressWarnings(
"java:S107")
759 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
762 msg.setAttachment(attachment);
802 return createFileMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
838 return createFileMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
878 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
882 msg.setAttachment(attachment);
927 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
930 msg.setAttachment(attachment);
959 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
998 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1000 msg.setContent(text);
1001 msg.setRobotInfo(messageRobotInfo);
1034 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1036 msg.setRobotInfo(messageRobotInfo);
1151 return createCustomMessage(sessionId, sessionType, content, attachment, config, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
1197 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1199 msg.setContent(content);
1200 if (attachment != null && attachment instanceof
FileAttachment) {
1201 ((FileAttachment) attachment).setNosTokenSceneKey(nosTokenSceneKey);
1203 msg.setAttachment(attachment);
1204 msg.setConfig(config);
1212 if (TextUtils.isEmpty(type) || TextUtils.isEmpty(robotAccount)) {
1213 throw new IllegalArgumentException(
"Invalid param, type and robot account should not be null");
1217 throw new IllegalArgumentException(
"Invalid param, content should not be null");
1219 throw new IllegalArgumentException(
"Invalid param, target should not be null");
1222 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1227 robotAttachment.
initSend(robotAccount, type, content, target, params);
1228 msg.setAttachment(robotAttachment);
1229 msg.setContent(text);
1263 IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1265 msg.setAttachment(netCallAttachment);
1300 IMMessageImpl msg =
new IMMessageImpl();
1301 msg.setSessionId(sessionId);
1302 msg.setSessionType(sessionType);
1343 IMMessageImpl forward = ((IMMessageImpl) message).deepClone();
1344 if (forward != null) {
1345 forward.setSessionId(sessionId);
1346 forward.setSessionType(sessionType);
1347 forward.setUuid(StringUtil.get32UUID());
1351 forward.setTime(TimeUtil.currentTimeMillis());
1352 forward.setServerId(0L);
1353 forward.setMessageId(0L);
1355 forward.setMsgAck(
false);
1356 forward.setHasSendAck(
false);
1357 forward.setTeamMsgAckCount(0);
1358 forward.setTeamMsgUnAckCount(0);
1362 if (attachment != null && attachment instanceof
FileAttachment) {
1363 final FileAttachment media = (FileAttachment) attachment;
1364 if (!TextUtils.isEmpty(media.
getUrl())) {
1373 private static IMMessageImpl initSendMessage(String toId,
SessionTypeEnum sessionType) {
1374 IMMessageImpl msg =
new IMMessageImpl();
1376 msg.setUuid(StringUtil.get32UUID());
1377 msg.setSessionId(toId);
1378 msg.setFromAccount(SDKCacheUI.getAccount());
1381 msg.setSessionType(sessionType);
1382 msg.setTime(TimeUtil.currentTimeMillis());
1408 if (messages == null || messages.isEmpty()) {
1411 final String sessionId = messages.get(0).getSessionId();
1412 if (sessionId==null) {
1415 List<IMMessage> msgList =
new ArrayList<>(messages.size());
1418 if (!sessionId.equals(msg.getSessionId())){
1427 return buildHeader(0, msgList.size()) +
"\n" + buildBody(msgList);
1437 private static String buildHeader(
int version,
int message_count) {
1438 JSONObject obj =
new JSONObject();
1440 obj.put(
"version", version);
1442 obj.put(
"terminal", IAuthService.ClientType.Android);
1443 obj.put(
"sdk_version", BuildConfig.VERSION_NAME);
1444 obj.put(
"app_version", BuildConfig.VERSION_CODE);
1445 obj.put(
"message_count", message_count);
1446 }
catch (JSONException e) {
1447 e.printStackTrace();
1449 return obj.toString();
1458 private static String buildBody(@NonNull List<IMMessage> msgList) {
1459 String enter =
"\n";
1460 if (msgList.isEmpty()) {
1463 StringBuilder stringBuilder =
new StringBuilder();
1465 stringBuilder.append(enter).append(MessageConvert.convertMessageToJson(msg, SDKCacheUI.getAccount()));
1467 return stringBuilder.substring(enter.length());
1492 if (TextUtils.isEmpty(json)) {
1495 return MessageConvert.convertJsonToMessage(json, SDKCacheUI.getAccount());
1522 return MessageConvert.convertMessageToJson(msg, SDKCacheUI.getAccount());
1553 @androidx.annotation.NonNull
1556 attachment.
setPath(file.getPath());
1557 attachment.
setSize(file.length());
1558 int[] dimension = BitmapDecoder.decodeBound(file);
1562 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1599 @androidx.annotation.NonNull
1604 int[] dimension = BitmapDecoder.decodeBound(context, uri);
1641 @androidx.annotation.NonNull
1644 attachment.
setPath(file.getPath());
1645 attachment.
setSize(file.length());
1647 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1684 @androidx.annotation.NonNull
1735 @androidx.annotation.NonNull
1738 attachment.
setPath(file.getPath());
1739 attachment.
setSize(file.length());
1744 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1793 @androidx.annotation.NonNull
1795 String nosTokenSceneKey) {
1836 @androidx.annotation.NonNull
1839 attachment.
setPath(file.getPath());
1840 attachment.
setSize(file.length());
1842 attachment.
setExtension(StringUtil.getExtension(file.getName()));
1879 @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)
创建一条自定义消息。