NIMSDK-AOS  9.19.0
MessageBuilder.java
浏览该文件的文档.
1 package com.netease.nimlib.sdk.msg;
2 
3 import android.content.Context;
4 import android.net.Uri;
5 import android.text.TextUtils;
6 
7 import com.netease.nimlib.BuildConfig;
8 import com.netease.nimlib.NimNosSceneKeyConstant;
9 import com.netease.nimlib.SDKCache;
10 import com.netease.nimlib.biz.constant.IAuthService;
11 import com.netease.nimlib.migration.MessageConvert;
12 import com.netease.nimlib.notifier.support26.annotation.NonNull;
30 import com.netease.nimlib.session.IMMessageImpl;
31 import com.netease.nimlib.util.BitmapDecoder;
32 import com.netease.nimlib.util.StringUtil;
33 import com.netease.nimlib.util.TimeUtil;
34 
35 import org.json.JSONException;
36 import org.json.JSONObject;
37 
38 import java.io.File;
39 import java.util.ArrayList;
40 import java.util.List;
41 
42 /**
43  * 云信 IM 消息构造器,提供构建各类型消息的接口。
44  */
45 public class MessageBuilder {
46 
47  /**
48  * 创建一条文本消息。
49  *
50  * @par 使用前提:
51  * 已登录 IM。
52  * @par 参数说明:
53  * <table>
54  * <tr>
55  * <th>参数名称</th>
56  * <th>描述</th>
57  * </tr>
58  * <tr>
59  * <td>sessionId</td>
60  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
61  * </tr>
62  * <tr>
63  * <td>sessionType</td>
64  * <td>会话类型,详见 SessionTypeEnum。</td>
65  * </tr>
66  * <tr>
67  * <td>text</td>
68  * <td>文本消息字符串,不得超过 5000 字符。</td>
69  * </tr>
70  * </table>
71  * @return
72  * {@link IMMessage} 对象。
73  *
74  */
75  public static IMMessage createTextMessage(String sessionId, SessionTypeEnum sessionType, String text) {
76  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
77  msg.setMsgType(MsgTypeEnum.text.getValue());
78  msg.setContent(text);
79  return msg;
80  }
81 
82  /**
83  * 创建一条图片消息。
84  *
85  * @par 使用前提:
86  * 已登录 IM。
87  * @par 参数说明:
88  * <table>
89  * <tr>
90  * <th>参数名称</th>
91  * <th>描述</th>
92  * </tr>
93  * <tr>
94  * <td>sessionId</td>
95  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
96  * </tr>
97  * <tr>
98  * <td>sessionType</td>
99  * <td>会话类型,详见 SessionTypeEnum。</td>
100  * </tr>
101  * <tr>
102  * <td>file</td>
103  * <td>Android File 对象。</td>
104  * </tr>
105  * </table>
106  * @return
107  * {@link IMMessage} 对象。
108  *
109  */
110  public static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file) {
111  return createImageMessage(sessionId, sessionType, file, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
112  }
113 
114  /**
115  * 创建一条图片消息。
116  *
117  * @par 使用前提:
118  * 已登录 IM。
119  * @par 参数说明:
120  * <table>
121  * <tr>
122  * <th>参数名称</th>
123  * <th>描述</th>
124  * </tr>
125  * <tr>
126  * <td>context</td>
127  * <td>Android Context 对象。</td>
128  * </tr>
129  * <tr>
130  * <td>sessionId</td>
131  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
132  * </tr>
133  * <tr>
134  * <td>sessionType</td>
135  * <td>会话类型,详见 SessionTypeEnum。</td>
136  * </tr>
137  * <tr>
138  * <td>uri</td>
139  * <td>图片文件 URI 地址。</td>
140  * </tr>
141  * </table>
142  * @return
143  * {@link IMMessage} 对象。
144  *
145  */
146  public static IMMessage createImageMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri) {
147  return createImageMessage(context,sessionId, sessionType, uri, null, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
148  }
149 
150  /**
151  * 创建一条图片消息。
152  *
153  * @par 使用前提:
154  * 已登录 IM。
155  * @par 参数说明:
156  * <table>
157  * <tr>
158  * <th>参数名称</th>
159  * <th>描述</th>
160  * </tr>
161  * <tr>
162  * <td>sessionId</td>
163  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
164  * </tr>
165  * <tr>
166  * <td>sessionType</td>
167  * <td>会话类型,详见 SessionTypeEnum。</td>
168  * </tr>
169  * <tr>
170  * <td>file</td>
171  * <td>Android File 对象。</td>
172  * </tr>
173  * <tr>
174  * <td>displayName</td>
175  * <td>图片文件显示名称,可不同于文件名。</td>
176  * </tr>
177  * </table>
178  * @return
179  * {@link IMMessage} 对象。
180  *
181  */
182  public static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName) {
183  return createImageMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
184  }
185 
186  /**
187  * 创建一条图片消息。
188  *
189  * @par 使用前提:
190  * 已登录 IM。
191  * @par 参数说明:
192  * <table>
193  * <tr>
194  * <th>参数名称</th>
195  * <th>描述</th>
196  * </tr>
197  * <tr>
198  * <td>context</td>
199  * <td>Android Context 对象。</td>
200  * </tr>
201  * <tr>
202  * <td>sessionId</td>
203  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
204  * </tr>
205  * <tr>
206  * <td>sessionType</td>
207  * <td>会话类型,详见 SessionTypeEnum。</td>
208  * </tr>
209  * <tr>
210  * <td>uri</td>
211  * <td>图片文件 URI 地址。</td>
212  * </tr>
213  * <tr>
214  * <td>displayName</td>
215  * <td>图片文件显示名称,可不同于文件名。</td>
216  * </tr>
217  * </table>
218  * @return
219  * {@link IMMessage} 对象。
220  *
221  */
222  public static IMMessage createImageMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri,String displayName) {
223  return createImageMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
224  }
225 
226  /**
227  * 创建一条图片消息。
228  *
229  * @par 使用前提:
230  * 已登录 IM。
231  * @par 参数说明:
232  * <table>
233  * <tr>
234  * <th>参数名称</th>
235  * <th>描述</th>
236  * </tr>
237  * <tr>
238  * <td>sessionId</td>
239  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
240  * </tr>
241  * <tr>
242  * <td>sessionType</td>
243  * <td>会话类型,详见 SessionTypeEnum。</td>
244  * </tr>
245  * <tr>
246  * <td>file</td>
247  * <td>Android File 对象。</td>
248  * </tr>
249  * <tr>
250  * <td>displayName</td>
251  * <td>图片文件显示名称,可不同于文件名。</td>
252  * </tr>
253  * <tr>
254  * <td>nosTokenSceneKey</td>
255  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
256  * </tr>
257  * </table>
258  * @return
259  * {@link IMMessage} 对象。
260  *
261  */
262  public static IMMessage createImageMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName, String nosTokenSceneKey) {
263  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
264  msg.setMsgType(MsgTypeEnum.image.getValue());
265 
266  final ImageAttachment attachment = createImageAttachment(file, displayName, nosTokenSceneKey);
267  msg.setAttachment(attachment);
268  return msg;
269  }
270 
271  /**
272  * 创建一条图片消息。
273  *
274  * @par 使用前提:
275  * 已登录 IM。
276  * @par 参数说明:
277  * <table>
278  * <tr>
279  * <th>参数名称</th>
280  * <th>描述</th>
281  * </tr>
282  * <tr>
283  * <td>context</td>
284  * <td>Android Context 对象。</td>
285  * </tr>
286  * <tr>
287  * <td>sessionId</td>
288  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
289  * </tr>
290  * <tr>
291  * <td>sessionType</td>
292  * <td>会话类型,详见 SessionTypeEnum。</td>
293  * </tr>
294  * <tr>
295  * <td>uri</td>
296  * <td>图片文件 URI 地址。</td>
297  * </tr>
298  * <tr>
299  * <td>displayName</td>
300  * <td>图片文件显示名称,可不同于文件名。</td>
301  * </tr>
302  * <tr>
303  * <td>nosTokenSceneKey</td>
304  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
305  * </tr>
306  * </table>
307  * @return
308  * {@link IMMessage} 对象。
309  *
310  */
311  public static IMMessage createImageMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName, String nosTokenSceneKey) {
312  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
313  msg.setMsgType(MsgTypeEnum.image.getValue());
314  final ImageAttachment attachment = createImageAttachment(context, uri, displayName, nosTokenSceneKey);
315  msg.setAttachment(attachment);
316  return msg;
317  }
318 
319  /**
320  * 创建一条语音消息。
321  *
322  * @par 使用前提:
323  * 已登录 IM。
324  * @par 参数说明:
325  * <table>
326  * <tr>
327  * <th>参数名称</th>
328  * <th>描述</th>
329  * </tr>
330  * <tr>
331  * <td>sessionId</td>
332  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
333  * </tr>
334  * <tr>
335  * <td>sessionType</td>
336  * <td>会话类型,详见 SessionTypeEnum。</td>
337  * </tr>
338  * <tr>
339  * <td>file</td>
340  * <td>Android File 对象。</td>
341  * </tr>
342  * <tr>
343  * <td>duration</td>
344  * <td>语音时长,单位为毫秒。</td>
345  * </tr>
346  * </table>
347  * @return
348  * {@link IMMessage} 对象。
349  *
350  */
351  public static IMMessage createAudioMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration) {
352  return createAudioMessage(sessionId, sessionType, file, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
353  }
354 
355  /**
356  * 创建一条语音消息。
357  *
358  * @par 使用前提:
359  * 已登录 IM。
360  * @par 参数说明:
361  * <table>
362  * <tr>
363  * <th>参数名称</th>
364  * <th>描述</th>
365  * </tr>
366  * <tr>
367  * <td>context</td>
368  * <td>Android Context 对象。</td>
369  * </tr>
370  * <tr>
371  * <td>sessionId</td>
372  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
373  * </tr>
374  * <tr>
375  * <td>sessionType</td>
376  * <td>会话类型,详见 SessionTypeEnum。</td>
377  * </tr>
378  * <tr>
379  * <td>uri</td>
380  * <td>音频文件 URI 地址。</td>
381  * </tr>
382  * <tr>
383  * <td>duration</td>
384  * <td>语音时长,单位为毫秒。</td>
385  * </tr>
386  * </table>
387  * @return
388  * {@link IMMessage} 对象。
389  *
390  */
391  public static IMMessage createAudioMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, long duration) {
392  return createAudioMessage(context,sessionId, sessionType, uri, duration, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
393  }
394 
395  /**
396  * 创建一条语音消息。
397  *
398  * @par 使用前提:
399  * 已登录 IM。
400  * @par 参数说明:
401  * <table>
402  * <tr>
403  * <th>参数名称</th>
404  * <th>描述</th>
405  * </tr>
406  * <tr>
407  * <td>sessionId</td>
408  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
409  * </tr>
410  * <tr>
411  * <td>sessionType</td>
412  * <td>会话类型,详见 SessionTypeEnum。</td>
413  * </tr>
414  * <tr>
415  * <td>file</td>
416  * <td>Android File 对象。</td>
417  * </tr>
418  * <tr>
419  * <td>duration</td>
420  * <td>语音时长,单位为毫秒。</td>
421  * </tr>
422  * <tr>
423  * <td>nosTokenSceneKey</td>
424  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
425  * </tr>
426  * </table>
427  * @return
428  * {@link IMMessage} 对象。
429  *
430  */
431  public static IMMessage createAudioMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration, String nosTokenSceneKey) {
432  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
433  msg.setMsgType(MsgTypeEnum.audio.getValue());
434  if (duration > 0 && duration < 1000) {// 最低显示1秒
435  duration = 1000;
436  }
437  final AudioAttachment attachment = createAudioAttachment(file, duration, nosTokenSceneKey);
438  msg.setAttachment(attachment);
439  return msg;
440  }
441 
442  /**
443  * 创建一条语音消息。
444  *
445  * @par 使用前提:
446  * 已登录 IM。
447  * @par 参数说明:
448  * <table>
449  * <tr>
450  * <th>参数名称</th>
451  * <th>描述</th>
452  * </tr>
453  * <tr>
454  * <td>context</td>
455  * <td>Android Context 对象。</td>
456  * </tr>
457  * <tr>
458  * <td>sessionId</td>
459  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
460  * </tr>
461  * <tr>
462  * <td>sessionType</td>
463  * <td>会话类型,详见 SessionTypeEnum。</td>
464  * </tr>
465  * <tr>
466  * <td>uri</td>
467  * <td>音频文件 URI 地址。</td>
468  * </tr>
469  * <tr>
470  * <td>duration</td>
471  * <td>语音时长,单位为毫秒。</td>
472  * </tr>
473  * <tr>
474  * <td>nosTokenSceneKey</td>
475  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
476  * </tr>
477  * </table>
478  * @return
479  * {@link IMMessage} 对象。
480  *
481  */
482  public static IMMessage createAudioMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, long duration, String nosTokenSceneKey) {
483  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
484  msg.setMsgType(MsgTypeEnum.audio.getValue());
485  if (duration > 0 && duration < 1000) {// 最低显示1秒
486  duration = 1000;
487  }
488  final AudioAttachment attachment = createAudioAttachment(context, uri, duration, nosTokenSceneKey);
489  msg.setAttachment(attachment);
490  return msg;
491  }
492 
493  /**
494  * 创建一条地理位置消息。
495  *
496  * @par 使用前提:
497  * 已登录 IM。
498  * @par 参数说明:
499  * <table>
500  * <tr>
501  * <th>参数名称</th>
502  * <th>描述</th>
503  * </tr>
504  * <tr>
505  * <td>sessionId</td>
506  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
507  * </tr>
508  * <tr>
509  * <td>sessionType</td>
510  * <td>会话类型,详见 SessionTypeEnum。</td>
511  * </tr>
512  * <tr>
513  * <td>lat</td>
514  * <td>位置纬度。</td>
515  * </tr>
516  * <tr>
517  * <td>lng</td>
518  * <td>位置经度。</td>
519  * </tr>
520  * <tr>
521  * <td>addr</td>
522  * <td>位置描述信息。</td>
523  * </tr>
524  * </table>
525  * @return
526  * {@link IMMessage} 对象。
527  *
528  */
529  public static IMMessage createLocationMessage(String sessionId, SessionTypeEnum sessionType, double lat, double lng, String addr) {
530  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
531  msg.setMsgType(MsgTypeEnum.location.getValue());
532 
533  final LocationAttachment location = new LocationAttachment();
534  location.setLatitude(lat);
535  location.setLongitude(lng);
536  location.setAddress(addr);
537  msg.setAttachStatus(AttachStatusEnum.transferred);
538  msg.setAttachment(location);
539 
540  return msg;
541  }
542 
543  /**
544  * 创建一条视频消息。
545  *
546  * @par 使用前提:
547  * 已登录 IM。
548  * @par 参数说明:
549  * <table>
550  * <tr>
551  * <th>参数名称</th>
552  * <th>描述</th>
553  * </tr>
554  * <tr>
555  * <td>sessionId</td>
556  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
557  * </tr>
558  * <tr>
559  * <td>sessionType</td>
560  * <td>会话类型,详见 SessionTypeEnum。</td>
561  * </tr>
562  * <tr>
563  * <td>file</td>
564  * <td>Android File 对象。</td>
565  * </tr>
566  * <tr>
567  * <td>duration</td>
568  * <td>视频文件时长,单位为毫秒。</td>
569  * </tr>
570  * <tr>
571  * <td>width</td>
572  * <td>视频宽度,单位为像素。</td>
573  * </tr>
574  * <tr>
575  * <td>height</td>
576  * <td>视频高度,单位为像素。</td>
577  * </tr>
578  * <tr>
579  * <td>displayName</td>
580  * <td>视频文件显示名称,可不同于文件名。</td>
581  * </tr>
582  * </table>
583  * @return
584  * {@link IMMessage} 对象。
585  *
586  */
587  public static IMMessage createVideoMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration, int width, int height, String displayName) {
588  return createVideoMessage(sessionId, sessionType, file, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
589  }
590 
591  /**
592  * 创建一条视频消息。
593  *
594  * @par 使用前提:
595  * 已登录 IM。
596  * @par 参数说明:
597  * <table>
598  * <tr>
599  * <th>参数名称</th>
600  * <th>描述</th>
601  * </tr>
602  * <tr>
603  * <td>context</td>
604  * <td>Android Context 对象。</td>
605  * </tr>
606  * <tr>
607  * <td>sessionId</td>
608  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
609  * </tr>
610  * <tr>
611  * <td>sessionType</td>
612  * <td>会话类型,详见 SessionTypeEnum。</td>
613  * </tr>
614  * <tr>
615  * <td>uri</td>
616  * <td>视频文件 URI 地址。</td>
617  * </tr>
618  * <tr>
619  * <td>duration</td>
620  * <td>视频文件时长,单位为毫秒。</td>
621  * </tr>
622  * <tr>
623  * <td>width</td>
624  * <td>视频宽度,单位为像素。</td>
625  * </tr>
626  * <tr>
627  * <td>height</td>
628  * <td>视频高度,单位为像素。</td>
629  * </tr>
630  * <tr>
631  * <td>displayName</td>
632  * <td>视频文件显示名称,可不同于文件名。</td>
633  * </tr>
634  * </table>
635  * @return
636  * {@link IMMessage} 对象。
637  *
638  */
639  @SuppressWarnings("java:S107")
640  public static IMMessage createVideoMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, long duration, int width, int height, String displayName) {
641  return createVideoMessage(context,sessionId, sessionType, uri, duration, width, height, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
642  }
643 
644  /**
645  * 创建一条视频消息。
646  *
647  * @par 使用前提:
648  * 已登录 IM。
649  * @par 参数说明:
650  * <table>
651  * <tr>
652  * <th>参数名称</th>
653  * <th>描述</th>
654  * </tr>
655  * <tr>
656  * <td>sessionId</td>
657  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
658  * </tr>
659  * <tr>
660  * <td>sessionType</td>
661  * <td>会话类型,详见 SessionTypeEnum。</td>
662  * </tr>
663  * <tr>
664  * <td>file</td>
665  * <td>Android File 对象。</td>
666  * </tr>
667  * <tr>
668  * <td>duration</td>
669  * <td>视频文件时长,单位为毫秒。</td>
670  * </tr>
671  * <tr>
672  * <td>width</td>
673  * <td>视频宽度,单位为像素。</td>
674  * </tr>
675  * <tr>
676  * <td>height</td>
677  * <td>视频高度,单位为像素。</td>
678  * </tr>
679  * <tr>
680  * <td>displayName</td>
681  * <td>视频文件显示名称,可不同于文件名。</td>
682  * </tr>
683  * <tr>
684  * <td>nosTokenSceneKey</td>
685  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
686  * </tr>
687  * </table>
688  * @return
689  * {@link IMMessage} 对象。
690  *
691  */
692  public static IMMessage createVideoMessage(String sessionId, SessionTypeEnum sessionType, File file, long duration, int width, int height, String displayName, String nosTokenSceneKey) {
693  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
694  msg.setMsgType(MsgTypeEnum.video.getValue());
695 
696  final VideoAttachment attachment = createVideoAttachment(file, duration, width, height, displayName, nosTokenSceneKey);
697  msg.setAttachment(attachment);
698 
699  BitmapDecoder.extractThumbnail(file.getPath(), attachment.getThumbPathForSave());
700 
701  return msg;
702  }
703 
704  /**
705  * 创建一条视频消息。
706  *
707  * @par 使用前提:
708  * 已登录 IM。
709  * @par 参数说明:
710  * <table>
711  * <tr>
712  * <th>参数名称</th>
713  * <th>描述</th>
714  * </tr>
715  * <tr>
716  * <td>context</td>
717  * <td>Android Context 对象。</td>
718  * </tr>
719  * <tr>
720  * <td>sessionId</td>
721  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
722  * </tr>
723  * <tr>
724  * <td>sessionType</td>
725  * <td>会话类型,详见 SessionTypeEnum。</td>
726  * </tr>
727  * <tr>
728  * <td>uri</td>
729  * <td>视频文件 URI 地址。</td>
730  * </tr>
731  * <tr>
732  * <td>duration</td>
733  * <td>视频文件时长,单位为毫秒。</td>
734  * </tr>
735  * <tr>
736  * <td>width</td>
737  * <td>视频宽度,单位为像素。</td>
738  * </tr>
739  * <tr>
740  * <td>height</td>
741  * <td>视频高度,单位为像素。</td>
742  * </tr>
743  * <tr>
744  * <td>displayName</td>
745  * <td>视频文件显示名称,可不同于文件名。</td>
746  * </tr>
747  * <tr>
748  * <td>nosTokenSceneKey</td>
749  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
750  * </tr>
751  * </table>
752  * @return
753  * {@link IMMessage} 对象。
754  *
755  */
756  @SuppressWarnings("java:S107")
757  public static IMMessage createVideoMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, long duration, int width, int height, String displayName, String nosTokenSceneKey) {
758  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
759  msg.setMsgType(MsgTypeEnum.video.getValue());
760  final VideoAttachment attachment = createVideoAttachment(context, uri, duration, width, height, displayName, nosTokenSceneKey);
761  msg.setAttachment(attachment);
762 
763  BitmapDecoder.extractThumbnail(uri, attachment.getThumbPathForSave());
764 
765  return msg;
766  }
767 
768  /**
769  * 创建一条文件消息。
770  *
771  * @par 使用前提:
772  * 已登录 IM。
773  * @par 参数说明:
774  * <table>
775  * <tr>
776  * <th>参数名称</th>
777  * <th>描述</th>
778  * </tr>
779  * <tr>
780  * <td>sessionId</td>
781  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
782  * </tr>
783  * <tr>
784  * <td>sessionType</td>
785  * <td>会话类型,详见 SessionTypeEnum。</td>
786  * </tr>
787  * <tr>
788  * <td>file</td>
789  * <td>Android File 对象。</td>
790  * </tr>
791  * <tr>
792  * <td>displayName</td>
793  * <td>文件显示名称,可不同于文件名。</td>
794  * </tr>
795  * </table>
796  * @return
797  * {@link IMMessage} 对象。
798  *
799  */
800  public static IMMessage createFileMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName) {
801  return createFileMessage(sessionId, sessionType, file, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
802  }
803 
804  /**
805  * 创建一条文件消息。
806  *
807  * @par 使用前提:
808  * 已登录 IM。
809  * @par 参数说明:
810  * <table>
811  * <tr>
812  * <th>参数名称</th>
813  * <th>描述</th>
814  * </tr>
815  * <tr>
816  * <td>sessionId</td>
817  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
818  * </tr>
819  * <tr>
820  * <td>sessionType</td>
821  * <td>会话类型,详见 SessionTypeEnum。</td>
822  * </tr>
823  * <tr>
824  * <td>uri</td>
825  * <td>文件 URI 地址。</td>
826  * </tr>
827  * <tr>
828  * <td>displayName</td>
829  * <td>文件显示名称,可不同于文件名。</td>
830  * </tr>
831  * </table>
832  * @return
833  * {@link IMMessage} 对象。
834  *
835  */
836  public static IMMessage createFileMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName) {
837  return createFileMessage(context,sessionId, sessionType, uri, displayName, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
838  }
839 
840  /**
841  * 创建一条文件消息。
842  *
843  * @par 使用前提:
844  * 已登录 IM。
845  * @par 参数说明:
846  * <table>
847  * <tr>
848  * <th>参数名称</th>
849  * <th>描述</th>
850  * </tr>
851  * <tr>
852  * <td>sessionId</td>
853  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
854  * </tr>
855  * <tr>
856  * <td>sessionType</td>
857  * <td>会话类型,详见 SessionTypeEnum。</td>
858  * </tr>
859  * <tr>
860  * <td>file</td>
861  * <td>Android File 对象。</td>
862  * </tr>
863  * <tr>
864  * <td>displayName</td>
865  * <td>文件显示名称,可不同于文件名。</td>
866  * </tr>
867  * <tr>
868  * <td>nosTokenSceneKey</td>
869  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
870  * </tr>
871  * </table>
872  * @return
873  * {@link IMMessage} 对象。
874  *
875  */
876  public static IMMessage createFileMessage(String sessionId, SessionTypeEnum sessionType, File file, String displayName, String nosTokenSceneKey) {
877  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
878  msg.setMsgType(MsgTypeEnum.file.getValue());
879 
880  final FileAttachment attachment = createFileAttachment(file, displayName, nosTokenSceneKey);
881  msg.setAttachment(attachment);
882  return msg;
883  }
884 
885  /**
886  * 创建一条文件消息。
887  *
888  * @par 使用前提:
889  * 已登录 IM。
890  * @par 参数说明:
891  * <table>
892  * <tr>
893  * <th>参数名称</th>
894  * <th>描述</th>
895  * </tr>
896  * <tr>
897  * <td>context</td>
898  * <td>Android Context 对象。</td>
899  * </tr>
900  * <tr>
901  * <td>sessionId</td>
902  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
903  * </tr>
904  * <tr>
905  * <td>sessionType</td>
906  * <td>会话类型,详见 SessionTypeEnum。</td>
907  * </tr>
908  * <tr>
909  * <td>uri</td>
910  * <td>文件 URI 地址。</td>
911  * </tr>
912  * <tr>
913  * <td>displayName</td>
914  * <td>文件显示名称,可不同于文件名。</td>
915  * </tr>
916  * <tr>
917  * <td>nosTokenSceneKey</td>
918  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
919  * </tr>
920  * </table>
921  * @return
922  * {@link IMMessage} 对象。
923  *
924  */
925  public static IMMessage createFileMessage(Context context,String sessionId, SessionTypeEnum sessionType, Uri uri, String displayName, String nosTokenSceneKey) {
926  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
927  msg.setMsgType(MsgTypeEnum.file.getValue());
928  final FileAttachment attachment = createFileAttachment(context, uri, displayName, nosTokenSceneKey);
929  msg.setAttachment(attachment);
930  return msg;
931  }
932 
933  /**
934  * 创建一条提醒消息。
935  *
936  * @par 使用前提:
937  * 已登录 IM。
938  * @par 参数说明:
939  * <table>
940  * <tr>
941  * <th>参数名称</th>
942  * <th>描述</th>
943  * </tr>
944  * <tr>
945  * <td>sessionId</td>
946  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
947  * </tr>
948  * <tr>
949  * <td>sessionType</td>
950  * <td>会话类型,详见 SessionTypeEnum。</td>
951  * </tr>
952  * </table>
953  * @return
954  * {@link IMMessage} 对象。
955  *
956  */
957  public static IMMessage createTipMessage(String sessionId, SessionTypeEnum sessionType) {
958  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
959  msg.setMsgType(MsgTypeEnum.tip.getValue());
960 
961  return msg;
962  }
963 
964  /**
965  * 创建一条机器人普通文本消息。
966  *
967  * @par 使用前提:
968  * 已登录 IM。
969  * @par 参数说明:
970  * <table>
971  * <tr>
972  * <th>参数名称</th>
973  * <th>描述</th>
974  * </tr>
975  * <tr>
976  * <td>sessionId</td>
977  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
978  * </tr>
979  * <tr>
980  * <td>sessionType</td>
981  * <td>会话类型,详见 SessionTypeEnum。</td>
982  * </tr>
983  * <tr>
984  * <td>text</td>
985  * <td>文本消息内容。</td>
986  * </tr>
987  * <tr>
988  * <td>messageRobotInfo</td>
989  * <td>{@link MessageRobotInfo}</td>
990  * </tr>
991  * </table>
992  * @return
993  * {@link IMMessage} 对象。
994  *
995  */
996  public static IMMessage createRobotTextMessage(String sessionId, SessionTypeEnum sessionType, String text, MessageRobotInfo messageRobotInfo) {
997  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
998  msg.setMsgType(MsgTypeEnum.text.getValue());
999  msg.setContent(text);
1000  msg.setRobotInfo(messageRobotInfo);
1001  return msg;
1002  }
1003 
1004  /**
1005  * 创建一条机器人提醒消息。
1006  *
1007  * @par 使用前提:
1008  * 已登录 IM。
1009  * @par 参数说明:
1010  * <table>
1011  * <tr>
1012  * <th>参数名称</th>
1013  * <th>描述</th>
1014  * </tr>
1015  * <tr>
1016  * <td>sessionId</td>
1017  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1018  * </tr>
1019  * <tr>
1020  * <td>sessionType</td>
1021  * <td>会话类型,详见 SessionTypeEnum。</td>
1022  * </tr>
1023  * <tr>
1024  * <td>messageRobotInfo</td>
1025  * <td>{@link MessageRobotInfo}</td>
1026  * </tr>
1027  * </table>
1028  * @return
1029  * {@link IMMessage} 对象。
1030  *
1031  */
1032  public static IMMessage createRobotTipMessage(String sessionId, SessionTypeEnum sessionType, MessageRobotInfo messageRobotInfo) {
1033  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1034  msg.setMsgType(MsgTypeEnum.tip.getValue());
1035  msg.setRobotInfo(messageRobotInfo);
1036  return msg;
1037  }
1038 
1039  /**
1040  * 创建一条自定义消息。
1041  *
1042  * @par 使用前提:
1043  * <ul><li>已登录 IM。</li><li>已注册一个自定义消息解析器。详见[自定义消息收发](https://doc.yunxin.163.com/messaging/docs/DY3Mjg5NjE?platform=android#%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95)。</li></ul>
1044  * @par 注意事项:
1045  * <ul><li>NIM SDK 不负责定义和解析自定义消息的具体内容,您需要自行完成解析。</li><li>SDK 会将自定义消息存入消息数据库,与内置消息一并展示在消息记录中。</li></ul>
1046  * @par 参数说明:
1047  * <table>
1048  * <tr>
1049  * <th>参数名称</th>
1050  * <th>描述</th>
1051  * </tr>
1052  * <tr>
1053  * <td>sessionId</td>
1054  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1055  * </tr>
1056  * <tr>
1057  * <td>sessionType</td>
1058  * <td>会话类型,详见 SessionTypeEnum。</td>
1059  * </tr>
1060  * <tr>
1061  * <td>attachment</td>
1062  * <td>MsgAttachment 对象。长度不得超过 5000 字符。</td>
1063  * </tr>
1064  * </table>
1065  * @return
1066  * {@link IMMessage} 对象。
1067  *
1068  */
1069  public static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, MsgAttachment attachment) {
1070  return createCustomMessage(sessionId, sessionType, null, attachment, null);
1071  }
1072 
1073  /**
1074  * 创建一条自定义消息。
1075  *
1076  * @par 使用前提:
1077  * <ul><li>已登录 IM。</li><li>已注册一个自定义消息解析器。详见[自定义消息收发](https://doc.yunxin.163.com/messaging/docs/DY3Mjg5NjE?platform=android#%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95)。</li></ul>
1078  * @par 注意事项:
1079  * <ul><li>NIM SDK 不负责定义和解析自定义消息的具体内容,您需要自行完成解析。</li><li>SDK 会将自定义消息存入消息数据库,与内置消息一并展示在消息记录中。</li></ul>
1080  * @par 参数说明:
1081  * <table>
1082  * <tr>
1083  * <th>参数名称</th>
1084  * <th>描述</th>
1085  * </tr>
1086  * <tr>
1087  * <td>sessionId</td>
1088  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1089  * </tr>
1090  * <tr>
1091  * <td>sessionType</td>
1092  * <td>会话类型,详见 SessionTypeEnum。</td>
1093  * </tr>
1094  * <tr>
1095  * <td>content</td>
1096  * <td>消息简要描述,可用于推送及状态栏消息提醒的展示。创建成功后可通过 {@link IMMessage#getContent} 获取。</td>
1097  * </tr>
1098  * <tr>
1099  * <td>attachment</td>
1100  * <td>MsgAttachment 对象。长度不得超过 5000 字符。</td>
1101  * </tr>
1102  * </table>
1103  * @return
1104  * {@link IMMessage} 对象。
1105  *
1106  */
1107  public static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, String content, MsgAttachment attachment) {
1108  return createCustomMessage(sessionId, sessionType, content, attachment, null);
1109  }
1110 
1111  /**
1112  * 创建一条自定义消息。
1113  *
1114  * @par 使用前提:
1115  * <ul><li>已登录 IM。</li><li>已注册一个自定义消息解析器。详见[自定义消息收发](https://doc.yunxin.163.com/messaging/docs/DY3Mjg5NjE?platform=android#%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95)。</li></ul>
1116  * @par 注意事项:
1117  * <ul><li>NIM SDK 不负责定义和解析自定义消息的具体内容,您需要自行完成解析。</li><li>SDK 会将自定义消息存入消息数据库,与内置消息一并展示在消息记录中。</li></ul>
1118  * @par 参数说明:
1119  * <table>
1120  * <tr>
1121  * <th>参数名称</th>
1122  * <th>描述</th>
1123  * </tr>
1124  * <tr>
1125  * <td>sessionId</td>
1126  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1127  * </tr>
1128  * <tr>
1129  * <td>sessionType</td>
1130  * <td>会话类型,详见 SessionTypeEnum。</td>
1131  * </tr>
1132  * <tr>
1133  * <td>content</td>
1134  * <td>消息简要描述,可用于推送及状态栏消息提醒的展示。创建成功后可通过 {@link IMMessage#getContent} 获取。</td>
1135  * </tr>
1136  * <tr>
1137  * <td>attachment</td>
1138  * <td>MsgAttachment 对象。长度不得超过 5000 字符。</td>
1139  * </tr>
1140  * <tr>
1141  * <td>config</td>
1142  * <td>自定义消息配置,详见 CustomMessageConfig。用于设定消息的声明周期,是否需要推送,是否需要计入未读数等。</td>
1143  * </tr>
1144  * </table>
1145  * @return
1146  * {@link IMMessage} 对象。
1147  *
1148  */
1149  public static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, String content, MsgAttachment attachment, CustomMessageConfig config) {
1150  return createCustomMessage(sessionId, sessionType, content, attachment, config, NimNosSceneKeyConstant.NIM_DEFAULT_IM);
1151  }
1152 
1153  /**
1154  * 创建一条自定义消息。
1155  *
1156  * @par 使用前提:
1157  * <ul><li>已登录 IM。</li><li>已注册一个自定义消息解析器。详见[自定义消息收发](https://doc.yunxin.163.com/messaging/docs/DY3Mjg5NjE?platform=android#%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95)。</li></ul>
1158  * @par 注意事项:
1159  * <ul><li>NIM SDK 不负责定义和解析自定义消息的具体内容,您需要自行完成解析。</li><li>SDK 会将自定义消息存入消息数据库,与内置消息一并展示在消息记录中。</li></ul>
1160  * @par 参数说明:
1161  * <table>
1162  * <tr>
1163  * <th>参数名称</th>
1164  * <th>描述</th>
1165  * </tr>
1166  * <tr>
1167  * <td>sessionId</td>
1168  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1169  * </tr>
1170  * <tr>
1171  * <td>sessionType</td>
1172  * <td>会话类型,详见 SessionTypeEnum。</td>
1173  * </tr>
1174  * <tr>
1175  * <td>content</td>
1176  * <td>消息简要描述,可用于推送及状态栏消息提醒的展示。创建成功后可通过 {@link IMMessage#getContent} 获取。</td>
1177  * </tr>
1178  * <tr>
1179  * <td>attachment</td>
1180  * <td>MsgAttachment 对象。长度不得超过 5000 字符。</td>
1181  * </tr>
1182  * <tr>
1183  * <td>config</td>
1184  * <td>自定义消息配置,详见 CustomMessageConfig。用于设定消息的声明周期,是否需要推送,是否需要计入未读数等。</td>
1185  * </tr>
1186  * <tr>
1187  * <td>nosTokenSceneKey</td>
1188  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1189  * </tr>
1190  * </table>
1191  * @return
1192  * {@link IMMessage} 对象。
1193  *
1194  */
1195  public static IMMessage createCustomMessage(String sessionId, SessionTypeEnum sessionType, String content, MsgAttachment attachment, CustomMessageConfig config, String nosTokenSceneKey) {
1196  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1197  msg.setMsgType(MsgTypeEnum.custom.getValue());
1198  msg.setContent(content);
1199  if (attachment != null && attachment instanceof FileAttachment) {
1200  ((FileAttachment) attachment).setNosTokenSceneKey(nosTokenSceneKey);
1201  }
1202  msg.setAttachment(attachment);
1203  msg.setConfig(config);
1204  return msg;
1205  }
1206 
1207  /**
1208  * 该方法不推荐使用,请使用 {@link MessageBuilder#createRobotTextMessage} 和 {@link MessageBuilder#createRobotTipMessage}。
1209  */
1210  public static IMMessage createRobotMessage(String sessionId, SessionTypeEnum sessionType, String robotAccount, String text, String type, String content, String target, String params) {
1211  if (TextUtils.isEmpty(type) || TextUtils.isEmpty(robotAccount)) {
1212  throw new IllegalArgumentException("Invalid param, type and robot account should not be null");
1213  }
1214 
1215  if (type.equals(RobotMsgType.TEXT) && content == null) {
1216  throw new IllegalArgumentException("Invalid param, content should not be null");
1217  } else if (type.equals(RobotMsgType.LINK) && TextUtils.isEmpty(target)) {
1218  throw new IllegalArgumentException("Invalid param, target should not be null");
1219  }
1220 
1221  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1222  msg.setMsgType(MsgTypeEnum.robot.getValue());
1223 
1224  // build attachment
1225  RobotAttachment robotAttachment = new RobotAttachment();
1226  robotAttachment.initSend(robotAccount, type, content, target, params);
1227  msg.setAttachment(robotAttachment);
1228  msg.setContent(text); // 文案显示用,便于全文检索等
1229 
1230  return msg;
1231  }
1232 
1233  /**
1234  * 创建一条通话记录消息。
1235  *
1236  * @par 使用前提:
1237  * 已登录 IM。
1238  * @par 参数说明:
1239  * <table>
1240  * <tr>
1241  * <th>参数名称</th>
1242  * <th>描述</th>
1243  * </tr>
1244  * <tr>
1245  * <td>sessionId</td>
1246  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1247  * </tr>
1248  * <tr>
1249  * <td>sessionType</td>
1250  * <td>会话类型,详见 SessionTypeEnum。</td>
1251  * </tr>
1252  * <tr>
1253  * <td>netCallAttachment</td>
1254  * <td>通话记录附件对象,详见 MsgAttachment。</td>
1255  * </tr>
1256  * </table>
1257  * @return
1258  * {@link IMMessage} 对象。
1259  *
1260  */
1261  public static IMMessage createNrtcNetcallMessage(String sessionId, SessionTypeEnum sessionType, MsgAttachment netCallAttachment) {
1262  IMMessageImpl msg = initSendMessage(sessionId, sessionType);
1263  msg.setMsgType(MsgTypeEnum.nrtc_netcall.getValue());
1264  msg.setAttachment(netCallAttachment);
1265  return msg;
1266  }
1267 
1268  /**
1269  * 创建一条空消息。
1270  *
1271  *该方法仅设置聊天对象以及时间点,用于历史消息查询。
1272  *
1273  * @par 使用前提:
1274  * 已登录 IM。
1275  * @par 参数说明:
1276  * <table>
1277  * <tr>
1278  * <th>参数名称</th>
1279  * <th>描述</th>
1280  * </tr>
1281  * <tr>
1282  * <td>sessionId</td>
1283  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1284  * </tr>
1285  * <tr>
1286  * <td>sessionType</td>
1287  * <td>会话类型,详见 SessionTypeEnum。</td>
1288  * </tr>
1289  * <tr>
1290  * <td>time</td>
1291  * <td>历史消息查询的起始时间 Unix 时间戳(毫秒)。</td>
1292  * </tr>
1293  * </table>
1294  * @return
1295  * {@link IMMessage} 对象。
1296  *
1297  */
1298  public static IMMessage createEmptyMessage(String sessionId, SessionTypeEnum sessionType, long time) {
1299  IMMessageImpl msg = new IMMessageImpl();
1300  msg.setSessionId(sessionId);
1301  msg.setSessionType(sessionType);
1302  msg.setTime(time);
1303  return msg;
1304  }
1305 
1306  /**
1307  * 创建一条待转发消息。
1308  *
1309  * @par 使用前提:
1310  * 已登录 IM 并实现消息发送和接收。
1311  * @par 参数说明:
1312  * <table>
1313  * <tr>
1314  * <th>参数名称</th>
1315  * <th>描述</th>
1316  * </tr>
1317  * <tr>
1318  * <td>message</td>
1319  * <td>已创建的 {@link IMMessage} 对象。</td>
1320  * </tr>
1321  * <tr>
1322  * <td>sessionId</td>
1323  * <td>会话 ID,根据会话类型(sessionType)判断:<ul><li>如果是单聊,则 sessionId 为用户的云信 IM 帐号(即 accid)</li><li>如果是群聊,则 sessionId 为群组 ID</li></ul></td>
1324  * </tr>
1325  * <tr>
1326  * <td>sessionType</td>
1327  * <td>会话类型,详见 SessionTypeEnum。</td>
1328  * </tr>
1329  * <tr>
1330  * <td>time</td>
1331  * <td>历史消息查询的起始时间 Unix 时间戳(毫秒)。</td>
1332  * </tr>
1333  * </table>
1334  * @return
1335  * 待转发的 {@link IMMessage} 对象。
1336  *
1337  */
1338  public static IMMessage createForwardMessage(IMMessage message, String sessionId, SessionTypeEnum sessionType) {
1339  if (message.getMsgType() == MsgTypeEnum.notification || message.getMsgType() == MsgTypeEnum.avchat || message.getMsgType() == MsgTypeEnum.robot) {
1340  return null;
1341  }
1342  IMMessageImpl forward = ((IMMessageImpl) message).deepClone();
1343  if (forward != null) {
1344  forward.setSessionId(sessionId);
1345  forward.setSessionType(sessionType);
1346  forward.setUuid(StringUtil.get32UUID());
1347  forward.setFromAccount(SDKCache.getAccount());
1348  forward.setDirect(MsgDirectionEnum.Out);
1349  forward.setStatus(MsgStatusEnum.sending);
1350  forward.setTime(TimeUtil.currentTimeMillis());
1351  forward.setServerId(0L);
1352  forward.setMessageId(0L);
1353  // clear team msg ack
1354  forward.setMsgAck(false);
1355  forward.setHasSendAck(false);
1356  forward.setTeamMsgAckCount(0);
1357  forward.setTeamMsgUnAckCount(0);
1358 
1359  // 接收到消息,但是附件没有下载成功的情况。不会再次上传附件,所以要将附件的发送状态直接改为def
1360  final MsgAttachment attachment = forward.getAttachment();
1361  if (attachment != null && attachment instanceof FileAttachment) {
1362  final FileAttachment media = (FileAttachment) attachment;
1363  if (!TextUtils.isEmpty(media.getUrl())) {
1364  forward.setAttachStatus(AttachStatusEnum.def);
1365  }
1366  }
1367  }
1368 
1369  return forward;
1370  }
1371 
1372  private static IMMessageImpl initSendMessage(String toId, SessionTypeEnum sessionType) {
1373  IMMessageImpl msg = new IMMessageImpl();
1374 
1375  msg.setUuid(StringUtil.get32UUID());
1376  msg.setSessionId(toId);
1377  msg.setFromAccount(SDKCache.getAccount());
1378  msg.setDirect(MsgDirectionEnum.Out);
1379  msg.setStatus(MsgStatusEnum.sending);
1380  msg.setSessionType(sessionType);
1381  msg.setTime(TimeUtil.currentTimeMillis());
1382 
1383  return msg;
1384  }
1385 
1386  /**
1387  * 创建多条待合并转发的消息。
1388  *
1389  * @par 使用前提:
1390  * 已登录 IM 并实现消息发送和接收。
1391  * @par 参数说明:
1392  * <table>
1393  * <tr>
1394  * <th>参数名称</th>
1395  * <th>描述</th>
1396  * </tr>
1397  * <tr>
1398  * <td>message</td>
1399  * <td>已创建的 {@link IMMessage} 列表。</td>
1400  * </tr>
1401  * </table>
1402  * @return
1403  * 待转发的多条消息字符串。
1404  *
1405  */
1406  public static String createForwardMessageListFileDetail(List<? extends IMMessage> messages) {
1407  if (messages == null || messages.isEmpty()) {
1408  return "";
1409  }
1410  final String sessionId = messages.get(0).getSessionId();
1411  if (sessionId==null) {
1412  return "";
1413  }
1414  List<IMMessage> msgList = new ArrayList<>(messages.size());
1415  for (IMMessage msg : messages) {
1416  // 不是来自同一会话,不添加
1417  if (!sessionId.equals(msg.getSessionId())){
1418  continue;
1419  }
1420  // 不是可以转发的类型,不添加
1421  if (msg.getMsgType() == MsgTypeEnum.notification || msg.getMsgType() == MsgTypeEnum.avchat || msg.getMsgType() == MsgTypeEnum.robot) {
1422  continue;
1423  }
1424  msgList.add(msg);
1425  }
1426  return buildHeader(0, msgList.size()) + "\n" + buildBody(msgList);
1427  }
1428 
1429  /**
1430  * 序列化文件的头部,占一行
1431  *
1432  * @param version 文件格式版本
1433  * @param message_count 消息数目
1434  * @return 头部字符串
1435  */
1436  private static String buildHeader(int version, int message_count) {
1437  JSONObject obj = new JSONObject();
1438  try {
1439  obj.put("version", version);
1440  //终端类型:Android
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();
1447  }
1448  return obj.toString();
1449  }
1450 
1451  /**
1452  * 把需要进行上传的数据 按照约定的“数据字段字典”转换后的json格式字符串,每条记录一行,存储在文本文件中,并从第二行开始存储(因为第一行存的是head信息)
1453  *
1454  * @param msgList 要合并的消息列表
1455  * @return 合并后的字符串
1456  */
1457  private static String buildBody(@NonNull List<IMMessage> msgList) {
1458  String enter = "\n";
1459  if (msgList.isEmpty()) {
1460  return "";
1461  }
1462  StringBuilder stringBuilder = new StringBuilder();
1463  for (IMMessage msg : msgList) {
1464  stringBuilder.append(enter).append(MessageConvert.convertMessageToJson(msg));
1465  }
1466  return stringBuilder.substring(enter.length());
1467  }
1468 
1469 
1470  /**
1471  * 创建一条 JSON 消息。
1472  *
1473  * @par 使用前提:
1474  * 已登录 IM。
1475  * @par 参数说明:
1476  * <table>
1477  * <tr>
1478  * <th>参数名称</th>
1479  * <th>描述</th>
1480  * </tr>
1481  * <tr>
1482  * <td>json</td>
1483  * <td>JSON 格式的字符串。</td>
1484  * </tr>
1485  * </table>
1486  * @return
1487  * {@link IMMessage} 对象。
1488  *
1489  */
1490  public static IMMessage createFromJson(String json){
1491  if (TextUtils.isEmpty(json)) {
1492  return null;
1493  }
1494  return MessageConvert.convertJsonToMessage(json);
1495  }
1496 
1497  /**
1498  * 将 IMMessage 对象转换成 JSON 格式的字符串。
1499  *
1500  * @par 使用前提:
1501  * 已调用 createXXMessage 创建一条消息,并返回 {@link IMMessage} 对象。
1502  * @par 参数说明:
1503  * <table>
1504  * <tr>
1505  * <th>参数名称</th>
1506  * <th>描述</th>
1507  * </tr>
1508  * <tr>
1509  * <td>msg</td>
1510  * <td>{@link IMMessage} 消息体。</td>
1511  * </tr>
1512  * </table>
1513  * @return
1514  * 转换后的 JSON 字符串。
1515  *
1516  */
1517  public static String convertMessageToJson(IMMessage msg) {
1518  if (msg == null) {
1519  return null;
1520  }
1521  return MessageConvert.convertMessageToJson(msg);
1522  }
1523 
1524  /**
1525  * 创建图片附件,用于上传图片文件。
1526  *
1527  * @par 使用前提:
1528  * 已登录 IM。
1529  * @par 参数说明:
1530  * <table>
1531  * <tr>
1532  * <th>参数名称</th>
1533  * <th>描述</th>
1534  * </tr>
1535  * <tr>
1536  * <td>file</td>
1537  * <td>Android File 对象。</td>
1538  * </tr>
1539  * <tr>
1540  * <td>displayName</td>
1541  * <td>图片文件显示名称,可不同于文件名。</td>
1542  * </tr>
1543  * <tr>
1544  * <td>nosTokenSceneKey</td>
1545  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1546  * </tr>
1547  * </table>
1548  * @return
1549  * ImageAttachment 对象。
1550  *
1551  */
1552  @androidx.annotation.NonNull
1553  public static ImageAttachment createImageAttachment(File file, String displayName, String nosTokenSceneKey) {
1554  final ImageAttachment attachment = new ImageAttachment();
1555  attachment.setPath(file.getPath());
1556  attachment.setSize(file.length());
1557  int[] dimension = BitmapDecoder.decodeBound(file);
1558  attachment.setWidth(dimension[0]);
1559  attachment.setHeight(dimension[1]);
1560  attachment.setDisplayName(displayName);
1561  attachment.setExtension(StringUtil.getExtension(file.getName()));
1562  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1563  return attachment;
1564  }
1565 
1566  /**
1567  * 创建图片附件,用于上传图片文件。
1568  *
1569  * @par 使用前提:
1570  * 已登录 IM。
1571  * @par 参数说明:
1572  * <table>
1573  * <tr>
1574  * <th>参数名称</th>
1575  * <th>描述</th>
1576  * </tr>
1577  * <tr>
1578  * <td>context</td>
1579  * <td>Android Context 对象。</td>
1580  * </tr>
1581  * <tr>
1582  * <td>uri</td>
1583  * <td>图片文件 URI 地址。</td>
1584  * </tr>
1585  * <tr>
1586  * <td>displayName</td>
1587  * <td>图片文件显示名称,可不同于文件名。</td>
1588  * </tr>
1589  * <tr>
1590  * <td>nosTokenSceneKey</td>
1591  * <td>图片文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1592  * </tr>
1593  * </table>
1594  * @return
1595  * ImageAttachment 对象。
1596  *
1597  */
1598  @androidx.annotation.NonNull
1599  public static ImageAttachment createImageAttachment(Context context, Uri uri, String displayName, String nosTokenSceneKey) {
1600  final ImageAttachment attachment = new ImageAttachment();
1601  attachment.setUri(uri);
1602  attachment.setSize(UriUtils.getFileSizeFromUri(context, uri));
1603  int[] dimension = BitmapDecoder.decodeBound(context, uri);
1604  attachment.setWidth(dimension[0]);
1605  attachment.setHeight(dimension[1]);
1606  attachment.setDisplayName(displayName);
1607  attachment.setExtension(UriUtils.getFileExtensionFromUri(context, uri));
1608  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1609  return attachment;
1610  }
1611 
1612  /**
1613  * 创建音频附件。用于上传音频文件。
1614  *
1615  * @par 使用前提:
1616  * 已登录 IM。
1617  * @par 参数说明:
1618  * <table>
1619  * <tr>
1620  * <th>参数名称</th>
1621  * <th>描述</th>
1622  * </tr>
1623  * <tr>
1624  * <td>file</td>
1625  * <td>Android File 对象。</td>
1626  * </tr>
1627  * <tr>
1628  * <td>duration</td>
1629  * <td>音频文件时长,单位为毫秒。</td>
1630  * </tr>
1631  * <tr>
1632  * <td>nosTokenSceneKey</td>
1633  * <td>音频文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1634  * </tr>
1635  * </table>
1636  * @return
1637  * AudioAttachment 对象。
1638  *
1639  */
1640  @androidx.annotation.NonNull
1641  public static AudioAttachment createAudioAttachment(File file, long duration, String nosTokenSceneKey) {
1642  final AudioAttachment attachment = new AudioAttachment();
1643  attachment.setPath(file.getPath());
1644  attachment.setSize(file.length());
1645  attachment.setDuration(duration);// ms
1646  attachment.setExtension(StringUtil.getExtension(file.getName()));
1647  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1648  return attachment;
1649  }
1650 
1651  /**
1652  * 创建音频附件。用于上传音频文件。
1653  *
1654  * @par 使用前提:
1655  * 已登录 IM。
1656  * @par 参数说明:
1657  * <table>
1658  * <tr>
1659  * <th>参数名称</th>
1660  * <th>描述</th>
1661  * </tr>
1662  * <tr>
1663  * <td>context</td>
1664  * <td>Android Context 对象。</td>
1665  * </tr>
1666  * <tr>
1667  * <td>uri</td>
1668  * <td>音频文件 URI 地址。</td>
1669  * </tr>
1670  * <tr>
1671  * <td>duration</td>
1672  * <td>音频文件时长,单位为毫秒。</td>
1673  * </tr>
1674  * <tr>
1675  * <td>nosTokenSceneKey</td>
1676  * <td>音频文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1677  * </tr>
1678  * </table>
1679  * @return
1680  * AudioAttachment 对象。
1681  *
1682  */
1683  @androidx.annotation.NonNull
1684  public static AudioAttachment createAudioAttachment(Context context, Uri uri, long duration, String nosTokenSceneKey) {
1685  final AudioAttachment attachment = new AudioAttachment();
1686  attachment.setUri(uri);
1687  attachment.setSize(UriUtils.getFileSizeFromUri(context, uri));
1688  attachment.setDuration(duration);// ms
1689  attachment.setExtension(UriUtils.getFileExtensionFromUri(context, uri));
1690  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1691  return attachment;
1692  }
1693 
1694  /**
1695  * 创建视频附件。用于上传视频文件。
1696  *
1697  * @par 使用前提:
1698  * 已登录 IM。
1699  * @par 参数说明:
1700  * <table>
1701  * <tr>
1702  * <th>参数名称</th>
1703  * <th>描述</th>
1704  * </tr>
1705  * <tr>
1706  * <td>file</td>
1707  * <td>Android File 对象。</td>
1708  * </tr>
1709  * <tr>
1710  * <td>duration</td>
1711  * <td>视频文件时长,单位为毫秒。</td>
1712  * </tr>
1713  * <tr>
1714  * <td>width</td>
1715  * <td>视频宽度,单位为像素。</td>
1716  * </tr>
1717  * <tr>
1718  * <td>height</td>
1719  * <td>视频高度,单位为像素。</td>
1720  * </tr>
1721  * <tr>
1722  * <td>displayName</td>
1723  * <td>视频文件显示名称,可不同于文件名。</td>
1724  * </tr>
1725  * <tr>
1726  * <td>nosTokenSceneKey</td>
1727  * <td>视频文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1728  * </tr>
1729  * </table>
1730  * @return
1731  * VideoAttachment 对象。
1732  *
1733  */
1734  @androidx.annotation.NonNull
1735  public static VideoAttachment createVideoAttachment(File file, long duration, int width, int height, String displayName, String nosTokenSceneKey) {
1736  final VideoAttachment attachment = new VideoAttachment();
1737  attachment.setPath(file.getPath());
1738  attachment.setSize(file.length());
1739  attachment.setDuration(duration);
1740  attachment.setWidth(width);
1741  attachment.setHeight(height);
1742  attachment.setDisplayName(displayName);
1743  attachment.setExtension(StringUtil.getExtension(file.getName()));
1744  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1745  return attachment;
1746  }
1747 
1748  /**
1749  * 创建视频附件。用于上传视频文件。
1750  *
1751  * @par 使用前提:
1752  * 已登录 IM。
1753  * @par 参数说明:
1754  * <table>
1755  * <tr>
1756  * <th>参数名称</th>
1757  * <th>描述</th>
1758  * </tr>
1759  * <tr>
1760  * <td>context</td>
1761  * <td>Android Context 对象。</td>
1762  * </tr>
1763  * <tr>
1764  * <td>uri</td>
1765  * <td>视频文件 URI 地址。</td>
1766  * </tr>
1767  * <tr>
1768  * <td>duration</td>
1769  * <td>视频文件时长,单位为毫秒。</td>
1770  * </tr>
1771  * <tr>
1772  * <td>width</td>
1773  * <td>视频宽度,单位为像素。</td>
1774  * </tr>
1775  * <tr>
1776  * <td>height</td>
1777  * <td>视频高度,单位为像素。</td>
1778  * </tr>
1779  * <tr>
1780  * <td>displayName</td>
1781  * <td>视频文件显示名称,可不同于文件名。</td>
1782  * </tr>
1783  * <tr>
1784  * <td>nosTokenSceneKey</td>
1785  * <td>视频文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1786  * </tr>
1787  * </table>
1788  * @return
1789  * VideoAttachment 对象。
1790  *
1791  */
1792  @androidx.annotation.NonNull
1793  public static VideoAttachment createVideoAttachment(Context context, Uri uri, long duration, int width, int height, String displayName,
1794  String nosTokenSceneKey) {
1795  final VideoAttachment attachment = new VideoAttachment();
1796  attachment.setUri(uri);
1797  attachment.setSize(UriUtils.getFileSizeFromUri(context, uri));
1798  attachment.setDuration(duration);
1799  attachment.setWidth(width);
1800  attachment.setHeight(height);
1801  attachment.setDisplayName(displayName);
1802  attachment.setExtension(UriUtils.getFileExtensionFromUri(context, uri));
1803  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1804  return attachment;
1805  }
1806 
1807  /**
1808  * 创建文件附件。用于上传文件。
1809  *
1810  * @par 使用前提:
1811  * 已登录 IM。
1812  * @par 参数说明:
1813  * <table>
1814  * <tr>
1815  * <th>参数名称</th>
1816  * <th>描述</th>
1817  * </tr>
1818  * <tr>
1819  * <td>file</td>
1820  * <td>Android File 对象。</td>
1821  * </tr>
1822  * <tr>
1823  * <td>displayName</td>
1824  * <td>文件显示名称,可不同于文件名。</td>
1825  * </tr>
1826  * <tr>
1827  * <td>nosTokenSceneKey</td>
1828  * <td>文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1829  * </tr>
1830  * </table>
1831  * @return
1832  * FileAttachment 对象。
1833  *
1834  */
1835  @androidx.annotation.NonNull
1836  public static FileAttachment createFileAttachment(File file, String displayName, String nosTokenSceneKey) {
1837  final FileAttachment attachment = new FileAttachment();
1838  attachment.setPath(file.getPath());
1839  attachment.setSize(file.length());
1840  attachment.setDisplayName(displayName);
1841  attachment.setExtension(StringUtil.getExtension(file.getName()));
1842  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1843  return attachment;
1844  }
1845 
1846  /**
1847  * 创建文件附件。用于上传文件。
1848  *
1849  * @par 使用前提:
1850  * 已登录 IM。
1851  * @par 参数说明:
1852  * <table>
1853  * <tr>
1854  * <th>参数名称</th>
1855  * <th>描述</th>
1856  * </tr>
1857  * <tr>
1858  * <td>context</td>
1859  * <td>Android Context 对象。</td>
1860  * </tr>
1861  * <tr>
1862  * <td>uri</td>
1863  * <td>文件 URI 地址。</td>
1864  * </tr>
1865  * <tr>
1866  * <td>displayName</td>
1867  * <td>文件显示名称,可不同于文件名。</td>
1868  * </tr>
1869  * <tr>
1870  * <td>nosTokenSceneKey</td>
1871  * <td>文件上传时使用的 NOS Scene Key,详见 NimNosSceneKeyConstant。</td>
1872  * </tr>
1873  * </table>
1874  * @return
1875  * FileAttachment 对象。
1876  *
1877  */
1878  @androidx.annotation.NonNull
1879  public static FileAttachment createFileAttachment(Context context, Uri uri, String displayName, String nosTokenSceneKey) {
1880  final FileAttachment attachment = new FileAttachment();
1881  attachment.setUri(uri);
1882  attachment.setSize(UriUtils.getFileSizeFromUri(context, uri));
1883  attachment.setDisplayName(displayName);
1884  attachment.setExtension(UriUtils.getFileExtensionFromUri(context, uri));
1885  attachment.setNosTokenSceneKey(nosTokenSceneKey);
1886  return attachment;
1887  }
1888 }
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中获取文件的实际大小
Definition: UriUtils.java:190
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)
创建一条自定义消息。
带有文件的附件类型的基类 描述文件的相关信息
NIM消息实体数据结构。 第三方APP不要调用设置类接口,调用之后不会被持久化
Definition: IMMessage.java:10
消息本身发送/接收状态,附件状态见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中获取文件的扩展名,如果没有则返回空字符串
Definition: UriUtils.java:160
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 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)
创建一条图片消息。
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)
创建一条自定义消息。