你可以使用声网 RTM SDK 发送和接收图片或文件消息。
声网 RTM SDK 支持发送大小不超过 30 MB 的任意文件格式的非空图片或文件。每份上传到声网服务器的图片或文件都对应一个 media ID,在服务端保存 7 天。你可以通过 media ID 在 7 天有效期内从声网服务器下载对应的图片或文件。
文件或图片的数据流转过程如下:
你可以通过 IImageMessage
对象对图片进行以下操作:
你可以通过 IFileMessage
对象对文件进行以下操作:
声网 RTM SDK 引入了 IImageMessage
类和 IFileMessage
类用于保存和传递系统生成的 media ID。IImageMessage
类和 IFileMessage
类继承自 IMessage
类,所以你可以通过已有的点对点消息或频道消息发送方法传递 IImageMessage
实例和 IFileMessage
实例,从而实现图片或文件消息的发送和接收。
一般情况下的发送和接收图片消息流程如下:
上传图片到声网服务器。图片上传成功时,SDK 会通过回调返回一个 IImageMessage
实例。
上传图片到声网服务器:
m_rtmService->createImageMessageByUploading(filePath.c_str(), requestId);
如果你存有一个已上传图片对应的 media ID 且 media ID 仍然处于 7 天有效期内,可通过如下代码直接创建一个 IImageMessage
实例:
m_rtmService->createImageMessageByMediaId(mediaId.c_str());
(可选)通过获取的实例设置图片的长宽或缩略图。
设置图片长宽:
imageMessage->setWidth(imageWidth);
imageMessage->setWidth(imageHeight);
设置图片缩略图:
imageMessage->setThumbnailWidth(thumbWidth);
imageMessage->setThumbnailHeight(thumbHeight);
将 IImageMessage
实例通过点对点消息或频道消息的方式发送给指定用户或指定频道。
发送图片点对点消息示例代码:
m_rtmService->sendMessageToPeer(account.c_str(), imageMessage, options);
发送图片频道消息:
m_Channel->sendMessage(imageMessage, options);
收到图片消息的用户会收到相应回调,你可以通过获取 IImageMessage
实例携带的 media ID 信息并通过 media ID 将相应图片保存至本地。
接收图片点对点消息:
// CRTMCallBack extend from IRtmServiceEventHandler
void CRTMCallBack::onImageMessageReceivedFromPeer(const char *peerId, const IImageMessage* message)
{
if(message){
//deal with message
}
}
接收图片频道消息:
// CRTMCallBack extend from IChannelEventHandler
void CRTMCallBack::onImageMessageReceived(const char *userId, const IImageMessage* message)
{
if(message){
//deal with message
}
}
一般情况下,你可以通过 media ID 直接将图片下载至本地存储:
m_rtmService->downloadMediaToFile(mediaId.c_str(), filePath.c_str(), requestId);
对于需要快速存取已下载图片的场景,你可以将图片下载至本地内存:
m_rtmService->downloadMediaToMemory(mediaId.c_str(), long long &requestId);
如果你要取消上传或下载图片,参考以下示例代码:
m_rtmService->cancelMediaUpload(requestId);
m_rtmService->cancelMediaDownload(requestId);
一般情况下的发送和接收文件消息流程如下:
上传文件到声网服务器。文件上传成功时,SDK 会通过回调返回一个 IFileMessage
实例。
上传文件到声网服务器:
m_rtmService->createFileMessageByUploading(filePath.c_str(), requestId);
如果你存有一个已上传文件对应的 media ID 且 media ID 仍然处于 7 天有效期内,可通过如下代码直接创建一个 IFileMessage
实例:
m_rtmService->createFileMessageByMediaId(mediaId.c_str());
(可选)通过获取的实例设置文件的缩略图。
imageMessage->setThumbnail(imageData, imageSize);
将 IFileMessage
实例通过点对点消息或频道消息的方式发送给指定用户或指定频道。
发送文件点对点消息:
m_rtmService->sendMessageToPeer(account.c_str(), fileMessage, options);
发送文件频道消息:
m_Channel->sendMessage(fileMessage, options);
收到文件消息的用户会收到相应回调,通过获取 IFileMessage
实例携带的 media ID 信息并通过 media ID 将相应文件保存至本地。
接收文件点对点消息:
// CRTMCallBack extend from IRtmServiceEventHandler
void CRTMCallBack::onFileMessageReceivedFromPeer(const char *peerId, const IFileMessage* message)
{
if(message){
//deal with message
}
}
接收文件频道消息:
// CRTMCallBack extend from IChannelEventHandler
void CRTMCallBack::onFileMessageReceived(const char *userId, const IFileMessage* message)
{
if(message){
//deal with message
}
}
一般情况下,你可以通过 media ID 直接将文件下载至本地存储:
m_rtmService->downloadMediaToFile(mediaId.c_str(), filePath.c_str(), requestId);
对于需要快速存取已下载文件的场景,你可以将文件下载至本地内存:
m_rtmService->downloadMediaToMemory(mediaId.c_str(), long long &requestId);
如果你要取消上传或下载文件,参考以下示例代码:
m_rtmService->cancelMediaUpload(requestId);
m_rtmService->cancelMediaDownload(requestId);
filePath
参数必须是 UTF-8 编码格式字符串,而且必须是绝对路径。onDownloadMediaToMemoryResult
回调结束后访问相应内存地址。IImageMessage
自行设置上传图片的宽和高。设置内容只作为上传图片的附加属性存在,不影响上传图片本身内容。SDK 也不会对上传图片进行裁剪或缩放。IImageMessage
实例时需要调用该实例的 release
方法将其销毁。createFileMessageByUploading
createImageMessageByUploading
cancelMediaUpload
cancelMediaDownload
createFileMessageByMediaId
createImageMessageByMediaId
downloadMediaToMemory
downloadMediaToFile
onMediaUploadingProgress
onMediaDownloadingProgress
onMediaCancelResult
onFileMediaUploadResult
onImageMediaUploadResult
onFileMessageReceivedFromPeer
onImageMessageReceivedFromPeer
onFileMessageReceived
onImageMessageReceived
onMediaDownloadToMemoryResult
onMediaDownloadToFileResult