Receiving Message
Feature Description
The
RecvNewMsgCallback
is used to listen for and receive all types of messages (text, custom, and rich media).Setting a Message Listener
Adding a listener
The receiver calls the
AddRecvNewMsgCallback
(Details) to add a message listener. We recommend it be called early, such as after the chat page is initialized, to ensure timely message receiving in the application.Removing a listener
To stop receiving messages, the receiver can call
RemoveRecvNewMsgCallback
(Details) to remove the message listener.Receiving a Text Message
The receiver can receive a one-to-one or group text message by using a message listener in the following steps:
1. Call
AddRecvNewMsgCallback
to set the event listener.2. Listen for the
RecvNewMsgCallback
callback to receive text messages.3. To stop receiving messages, call
RemoveRecvNewMsgCallback
to remove the listener. This step is optional and can be performed as needed.Sample code:
TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Text){string text = elem.text_elem_content;}}}})
Receiving a Custom Message
The receiver can receive a custom one-to-one or group message by using a message listener in the following steps:
1. Call
AddRecvNewMsgCallback
to set the event listener.2. Listen for the
RecvNewMsgCallback
callback to receive custom messages.3. To stop receiving messages, call
RemoveRecvNewMsgCallback
to remove the listener. This step is optional and can be performed as needed.Sample code:
TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Custom){string data = elem.custom_elem_data;string desc = elem.custom_elem_desc;string ext = elem.custom_elem_ext;}}}})
Receiving a Rich Media Message
The receiver can receive a rich media message by using a message listener in the following steps:
1. Call
AddRecvNewMsgCallback
to set the event listener.2. Listen for the
RecvNewMsgCallback
callback to receive rich media messages.3. Parse the
elem_type
attribute in the Message
message and then parse the message again according to the type to get the specific content of the elements in the message.4. To stop receiving messages, call
RemoveRecvNewMsgCallback
to remove the listener. This step is optional and can be performed as needed.Image message
The image in an image message can be in three formats: original, large, and thumbnail. The latter two are automatically generated by the SDK during message sending and can be ignored.
Large image: A large image is an image obtained after the original image is proportionally compressed. After the compression, the height or width (whichever is shorter) is equal to 720 pixels.
Thumbnail: A thumbnail is an image obtained after the original image is proportionally compressed. After the compression, the height or width (whichever is shorter) is equal to 198 pixels.
Sample code:
TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Image){string path = elem.image_elem_orig_path; // Image upload path. This field applies only to the message sender who can use it to display the image on the screen in advance to optimize the experience.switch(elem.image_elem_level){case TIMImageLevel.kTIMImageLevel_Orig: // Send the original image{string id = elem.image_elem_orig_id;int h = elem.image_elem_orig_pic_height;int w = elem.image_elem_orig_pic_width;int size = elem.image_elem_orig_pic_size;string url = elem.image_elem_orig_url;break;}case TIMImageLevel.kTIMImageLevel_HD: // Send the large image (large in size){string id = elem.image_elem_large_id;int h = elem.image_elem_large_pic_height;int w = elem.image_elem_large_pic_width;int size = elem.image_elem_large_pic_size;string url = elem.image_elem_large_url;break;}case TIMImageLevel.kTIMImageLevel_Compression: // Send the thumbnail (small in size; default){string id = elem.image_elem_thumb_id;int h = elem.image_elem_orig_thumb_height;int w = elem.image_elem_orig_thumb_width;int size = elem.image_elem_orig_thumb_size;string url = elem.image_elem_thumb_url;break;}}}}}})
Video message
After a video message is received, a video preview is displayed on the chat page, and the video is played back after the user clicks the message.
Two steps are required:
The IM SDK will download video messages when free, which can be directly used by you and will be cleared when the application is uninstalled.
The following sample code demonstrates how to parse the video content from
Message
:TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Video){// Parse the video message attributes such as thumbnail, playback address, width and height, and sizestring type = elem.video_elem_video_type;int size = elem.video_elem_video_size;int duration = elem.video_elem_video_duration;string path = elem.video_elem_video_path;string url = elem.video_elem_video_url;int imageType = elem.video_elem_image_type;int imageSize = elem.video_elem_image_size;int w = elem.video_elem_image_width;int h = elem.video_elem_image_height;string imagePath = elem.video_elem_image_path;string url = elem.video_elem_image_url;}}}})
Audio message
The IM SDK will download audio messages when free, which can be directly used by you and will be cleared when the application is uninstalled.
The following sample code demonstrates how to parse the audio content from
Message
:TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Sound){// Parse the audio playback address, local address, size, and durationint size = elem.sound_elem_file_size;int duration = elem.sound_elem_file_time;string path = elem.sound_elem_file_path;string url = elem.sound_elem_url;}}}})
File message
The IM SDK will download file messages when free, which can be directly used by you and will be cleared when the application is uninstalled.
The following sample code demonstrates how to parse the file content from
Message
:TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_File){// Parse the filename, size, URL, etc. of the file messageint size = elem.file_elem_file_size;string path = elem.file_elem_file_path;string name = elem.file_elem_file_name;string url = elem.file_elem_url;}}}})
Geographical location message
The following sample code demonstrates how to parse the geographical location content from
Message
:TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Location){// Parse the geographical location information such as latitude, longitude, and descriptiondouble longitude = elem.location_elem_longitude;double latitude = elem.location_elem_latitude;string desc = elem.location_elem_desc;}}}})
Emoji message
The SDK provides a passthrough channel only for emoji messages. Here,
index
and data
can be customized.For example, the sender can set
index
to 1
and data
to x12345
to indicate the smile emoji.
The receiver parses the received emoji message as 1
and x12345
and displays the message as the smile emoji according to the preset rules.The following sample code demonstrates how to parse the emoji content from
Message
:TencentIMSDK.AddRecvNewMsgCallback((List<Message> messages, string user_data)=>{foreach(Message message in messages){foreach (Elem elem in message.message_elem_array){// There is a next elementif (elem.elem_type == TIMElemType.kTIMElem_Face){string data = elem.face_elem_buf;int index = elem.face_elem_index;}}}})
Group tip message
Group tip messages are tips received by users in addition to ordinary messages in a group chat, for example, "The admin removed alice from the group chat" and "bob renamed the group "xxxx"".
Note:
Group tip messages will be received by only group members but not one-to-one chat parties.
There are many types of group tip messages. For more information, see the definition of
GroupTipsElem
(Details).After receiving a group tip message, the receiver generally needs to:
1. Parse each field in
GroupTipsElem
.2. Identify the message type according to
group_tips_elem_tip_type
.3. Merge other fields into the content for display according to the type.
For example:
The receiver parses
type
as kTIMGroupTip_GroupInfoChange
, indicating that this is a notification of group profile change.
The receiver can get the operator information from group_tips_elem_op_user_info
and the modified group name from group_tips_elem_group_change_info_array
.
At this point, the receiver can merge the "operator" and "modified group name" to create a group tip, such as "Alice renamed the group "group123"".The following sample code demonstrates how to parse the tip content from
V2TIMMessage
:if(tip.group_tips_elem_tip_type == TIMGroupTipType.kTIMGroupTip_GroupInfoChange){tip.group_tips_elem_group_id; // Groupmessage.group_tips_elem_tip_type; // Group tip typemessage.group_tips_elem_op_user_info; // Operator profilemessage.group_tips_elem_changed_user_info_array; // User profile operated onmessage.group_tips_elem_group_change_info_array; // Group information change detailsmessage.group_tips_elem_member_change_info_array; // Group member change information}
Getting the Message Sending Progress
TencentIMSDK.SetMsgElemUploadProgressCallback((Message message, int index, int cur_size, int total_size, string user_data)=>{// `message` indicates the message instance being sent.// `index` indicates the number of the file being uploaded.// `cur_size` indicates the current size (in MB) of the file being uploaded.// `total_size` indicates the total size of the file being uploaded.})
Receiving a Message Containing Multiple Element Objects
1. Use the
Message
object to parse message_elem_array
.2. Traverse
message_elem_array
to get all the element objects.Sample code:
foreach (Elem elem in message.message_elem_array) {// There is a next element}