- Android
- iOS
- JavaScript
- Flutter
- ReactNative
API Definition
/**
* send a media message (upload the media first, then send the message)
* @param content media-message object
* @param conversation conversation
* @param callback send callback
* @return message object
*/
Message sendMediaMessage(MediaMessageContent content,
Conversation conversation,
ISendMediaMessageCallback callback);
Code Example
VideoMessage video = new VideoMessage();
video.setLocalPath("xxxxxxxxxx");
video.setSnapshotLocalPath("xxxxxxxxx");
video.setHeight(400);
video.setWidth(600);
video.setSize(1024);
video.setDuration(10);
Conversation conversation = new Conversation(Conversation.ConversationType.PRIVATE, "userid1");
IMessageManager.ISendMediaMessageCallback callback = new IMessageManager.ISendMediaMessageCallback() {
@Override
public void onProgress(int progress, Message message) {
Log.i("TAG", "onProgress");
}
@Override
public void onSuccess(Message message) {
Log.i("TAG", "send message success");
}
@Override
public void onError(Message message, int errorCode) {
Log.i("TAG", "send message error");
}
@Override
public void onCancel(Message message) {
Log.i("TAG", "onCancel");
}
};
Message message = JIM.getInstance().getMessageManager().sendMediaMessage(video, conversation, callback);
Log.i("TAG", "after send, clientMsgNo is " + message.getClientMsgNo());
API Definition
/// send a media message (upload the media first, then send the message)
/// - Parameters:
/// - content: media-message object
/// - conversation: conversation
/// - progressBlock: upload progress callback
/// - successBlock: success callback
/// - errorBlock: failure callback
/// - cancelBlock: callback triggered when the user cancels the upload
- (JMessage *)sendMediaMessage:(JMediaMessageContent *)content
inConversation:(JConversation *)conversation
progress:(void (^)(int progress, JMessage *message))progressBlock
success:(void (^)(JMessage *message))successBlock
error:(void (^)(JErrorCode errorCode, JMessage *message))errorBlock
cancel:(void (^)(JMessage *message))cancelBlock;
Code Example
//video message
JConversation *conversation = [[JConversation alloc] initWithConversationType:JConversationTypePrivate conversationId:@"userid2"];
JVideoMessage *video = [JVideoMessage videoWithData:videoFileData];
JMessage *m = [JIM.shared.messageManager sendMediaMessage:voice
inConversation:conversation
progress:^(int progress, JMessage *message) {
} success:^(JMessage *message) {
} error:^(JErrorCode errorCode, JMessage *message) {
} cancel:^(JMessage *message) {
}];
NSLog(@"after send, m.clientMsgNo is %lld", m.clientMsgNo);
Developers only need to pass a File object; the video sending method automatically captures the first frame as the cover image. For more properties, see Video Message.
Parameters
| Name | Type | Required | Default | Description | Version |
|---|---|---|---|---|---|
| message | Object | Yes | Message object | 1.0.0 | |
| message.conversationType | Number | Yes | Conversation type | 1.0.0 | |
| message.conversationId | String | Yes | Conversation ID. For PRIVATE conversations, it is the recipient userId; for GROUP conversations, it is the group ID. | 1.0.0 | |
| message.content | Object | Yes | 1.0.0 | ||
| message.content.file | File | Yes | Video object | 1.0.0 | |
| message.mentionInfo | Object | No | None | Applies when conversationType is GROUP. Setting mentionInfo marks this message as a mention message. | 1.0.0 |
| mentionInfo.mentionType | Number | No | None | Mention type. See Mention Message Enums for details. | 1.0.0 |
| mentionInfo.targetIds | Array | No | None | List of specified members. The SDK prioritizes mentionType when determining the mention type. | 1.0.0 |
| lifeTime | Number | No | 0 | Message destruction duration. It must be greater than 0, in ms; for example, 60 seconds is 1 * 60 * 1000. | 1.9.0 |
| lifeTimeAfterRead | Number | No | 0 | Read-once message duration. It must be greater than 0, in ms; for example, 60 seconds is 1 * 60 * 1000. | 1.9.0 |
callbacks Parameters
| Name | Type | Required | Default | Description | Version |
|---|---|---|---|---|---|
| callbacks | Object | No | Callback object | 1.0.0 | |
| callbacks.onbefore | Function | No | Pre-send callback. When invoked, it returns the temporary message identifier tid, which can be used to render the message. After a successful send, the backend updates the message state by tid. | 1.0.0 | |
| callbacks.onprogress | Function | No | File upload progress callback | 1.0.0 | |
| callbacks.onerror | Function | No | File upload failure callback. Returns error details and stops the message send. | 1.0.0 |
Success Callback
| Name | Type | Description | Version |
|---|---|---|---|
| message | Object | After sending succeeds, returns a message object with messageId and sentTime. See the message structure in Message | 1.0.0 |
Failure Callback
| Name | Type | Description | Version |
|---|---|---|---|
| result | Object | When sending fails, returns an object containing tid and error. Check error.msg directly or see [status codes].(../../../status_code/web) | 1.0.0 |
Code Example
let { ConversationType } = JIM;
// get the file object from the <input type="file"> onchange event
let file = e.target.files[0];
let message = {
conversationType: ConversationType.PRIVATE,
conversationId: 'userid02',
content: {
file: file
},
};
jim.sendVideoMessage(message, {
onbefore: (message) => {
/*
message.tid The message can now be rendered on the page. Use message.tid as its unique identifier and update the progress bar by message.tid when onprogress fires
*/
},
onprogress: ({ percent, message }) => {
console.log(`${percent}%`, message);
},
onerror: (error) => {
console.log('upload file error', error);
}
}).then((msg) => {
console.log('send video message successfully', msg)
}, (result) => {
let { error, tid } = result;
// Use tid to update the failed-message state. On Web, failed messages are stored only in SDK memory and are unavailable after a refresh
console.log(tid, error);
});
Because sending is asynchronous, calling sendMediaMessage synchronously returns a message object, which can be displayed in the UI immediately.
Use message.clientMsgNo as the unique identifier. After callback is triggered, update message state, such as upload progress, by clientMsgNo.
The SDK has built-in file upload support. Assign a local file path to VideoMessage.localPath; the SDK uploads the file automatically and returns its URL.
Note: Before sending files, images, videos, or similar messages, configure
OSSfile storage in the Admin Console.
Code Example
import JuggleIM from 'juggleim-rnsdk';
const conversation = {
type: 1,
id: 'userId1'
};
const videoMessage = {
conversation: conversation,
content: {
contentType: 'jg:video',
localPath: '/path/to/video.mp4',
snapshotLocalPath: '/path/to/snapshot.jpg',
width: 600,
height: 400,
duration: 10,
size: 1024
}
};
const callback = (message: any, errorCode: number, progress?: number) => {
if (errorCode === 0) {
console.log('sendMediaMessage success, messageId is ' + message.messageId);
} else if (errorCode === 100) {
console.log('sendMediaMessage onProgress, progress is ' + progress);
} else {
console.log('sendMediaMessage error, errorCode is ' + errorCode.toString());
}
};
JuggleIM.sendMediaMessage(videoMessage, callback).then((message) => {
console.log('after send, clientMsgNo is ' + message.clientMsgNo);
});
Because sending is asynchronous, calling sendMessage synchronously returns a message object, which can be displayed in the UI immediately.
Use message.clientMsgNo as the unique identifier. After callback is triggered, update message state, such as upload progress, by clientMsgNo.
The SDK has built-in file upload support. Assign a local file path to VideoMessage.localPath; the SDK uploads the file automatically and returns its URL.
Note: Before sending files, images, videos, or similar messages, configure
OSSfile storage in the Admin Console.
Code Example
Conversation conversation = Conversation(ConversationType.group, 'groupId1');
VideoMessage videoMessage = VideoMessage();
videoMessage.localPath = '/Applications/xxx/xxx/video.mp4';
videoMessage.snapshotLocalPath = '/Applications/xxx/xxx/snapshot.jpg';
videoMessage.height = 400;
videoMessage.width = 600;
videoMessage.duration = 10;
DataCallback<Message> callback = (m, errorCode) {
if (errorCode == 0) {
print("sendMediaMessage success, messageId is " + m.messageId);
} else {
print('sendMediaMessage error, errorCode is ' + errorCode.toString() + ', clientMsgNo is ' + m.clientMsgNo!.toString());
}
};
//progress ranges from 0 to 100
SendMessageProgressCallback progressCallback = (message, progress) {
print('sendMediaMessage onProgress, progress is $progress');
};
Message mediaMessage = await JuggleIm.instance.sendMediaMessage(videoMessage, conversation, callback, progressCallback);