addAdvancedMsgListenerを介してすべてのタイプのメッセージ(テキスト、カスタム、リッチメディアメッセージ)をリッスンして受信し、関連するコールバックはV2TimAdvancedMsgListenerプロトコルで定義されます。addAdvancedMsgListener (クリックして詳細を表示)を呼び出して、高度なメッセージリスナーを追加します。一般的には、Appがチャットメッセージインターフェースの初期化後など、時間内にメッセージを確実に受信できるように、比較的早い時点で呼び出すことをお勧めします。// メッセージリスナーの作成V2TimAdvancedMsgListener listener = V2TimAdvancedMsgListener(onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {//シングルチャット開封確認コールバック},onRecvMessageModified: (V2TimMessage message) {// msg変更後のメッセージオブジェクト},onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {//グループチャット開封確認コールバックreceiptList.forEach((element) {element.groupID; // グループidelement.msgID; // 開封確認されたメッセージIDelement.readCount; // グループメッセージの開封確認の数element.unreadCount; // グループメッセージの最新の未読数element.userID; // C2Cメッセージ相手ID});},onRecvMessageRevoked: (String messageid) {// ローカルのメンテナンスメッセージで相手によって撤回されたメッセージを処理します},onRecvNewMessage: (V2TimMessage message) async {// テキストメッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {message.textElem?.text;}// カスタムメッセージを使用しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) {message.customElem?.data;message.customElem?.desc;message.customElem?.extension;}// 画像メッセージを使用しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE) {message.imageElem?.path; // 画像がアップロードされたときのパスです。このフィールドはメッセージの送信者のみ持ちます。メッセージの送信者はこのフィールドを使用して画像を画面に事前表示し、画面表示の体験を最適化できます。message.imageElem?.imageList?.forEach((element) {// 拡大図、オリジナル画像、サムネイルのトラバーサル// 画像属性を解析しますelement?.height;element?.localUrl;element?.size;element?.type; // 拡大図、オリジナル画像、サムネイルelement?.url;element?.uuid;element?.width;});}// ビデオメッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_VIDEO) {// カバー、再生アドレス、幅と高さ、およびサイズなどのビデオメッセージの属性を解析します。message.videoElem?.UUID;message.videoElem?.duration;message.videoElem?.localSnapshotUrl;message.videoElem?.localVideoUrl;message.videoElem?.snapshotHeight;message.videoElem?.snapshotPath;// ...}// オーディオメッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND) {// 再生アドレス、サイズ、時間などの音声メッセージを解析します。message.soundElem?.UUID;message.soundElem?.dataSize;message.soundElem?.duration;message.soundElem?.localUrl;message.soundElem?.url;// ...}// ファイルメッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_FILE) {// ファイル名、ファイルサイズ、urlなどのファイルメッセージを解析しますmessage.fileElem?.UUID;message.fileElem?.fileName;message.fileElem?.fileSize;message.fileElem?.localUrl;message.fileElem?.path;message.fileElem?.url;}// 位置メッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_LOCATION) {// 緯度と経度、説明などの地理位置メッセージを解析しますmessage.locationElem?.desc;message.locationElem?.latitude;message.locationElem?.longitude;}// 絵文字メッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_FACE) {message.faceElem?.data;message.faceElem?.index;}// グループtipsテキストメッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS) {message.groupTipsElem?.groupID; // 属するグループmessage.groupTipsElem?.type; // グループTipsタイプmessage.groupTipsElem?.opMember; // オペレーターデータmessage.groupTipsElem?.opMember; // オペレーション対象のデータmessage.groupTipsElem?.groupChangeInfoList; // グループメッセージ変更の詳細message.groupTipsElem?.memberChangeInfoList; // グループメンバーの変更情報message.groupTipsElem?.memberCount; // グループの現在オンライン人数}// マージされたメッセージを処理しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_MERGER) {message.mergerElem?.abstractList;message.mergerElem?.isLayersOverLimit;message.mergerElem?.title;V2TimValueCallback<List<V2TimMessage>> download =await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMergerMessage(msgID: message.msgID!,);if (download.code == 0) {List<V2TimMessage>? messageList = download.data;}}if (message.textElem?.nextElem != null) {//最初のElemオブジェクトのnextElemメソッドを介して次のElemオブジェクトを取得します。次のElemオブジェクトが存在する場合はElemオブジェクトのインスタンスが返され、存在しない場合はnullが返されます。}},onSendMessageProgress: (V2TimMessage message, int progress) {//ファイルアップロード進行状況のコールバック},);// 高度なメッセージのイベントリスナーを追加しますTencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
// listenerを作成しますV2TimAdvancedMsgListener listener = V2TimAdvancedMsgListener(onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageModified: (V2TimMessage message) {},onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageRevoked: (String messageid) {},onRecvNewMessage: (V2TimMessage message) {},onSendMessageProgress: (V2TimMessage message, int progress) {},);// listenerを登録しますTencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);// listenerを削除しますTencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: listener);
addAdvancedMsgListenerを呼び出して、イベントリスナーを設定します。onRecvNewMessage (クリックして詳細を表示)コールバックをリッスンし、その中でカスタムメッセージを受信します。removeAdvancedMsgListenerを呼び出して、リスナーを削除します。この手順は必須ではなく、お客様は業務のニーズに応じて呼び出すことができます。V2TimAdvancedMsgListener listener = V2TimAdvancedMsgListener(onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageModified: (V2TimMessage message) {},onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageRevoked: (String messageid) {},onRecvNewMessage: (V2TimMessage message) {// テキストメッセージを処理しますif(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT){String text = message.textElem.text;}},onSendMessageProgress: (V2TimMessage message, int progress) {},);TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
addAdvancedMsgListenerを呼び出して、イベントリスナーを設定します。onRecvNewMessage (クリックして詳細を表示)コールバックをリッスンし、その中でカスタムメッセージを受信します。removeAdvancedMsgListenerを呼び出して、リスナーを削除します。この手順は必須ではなく、お客様は業務のニーズに応じて呼び出すことができます。V2TimAdvancedMsgListener listener = V2TimAdvancedMsgListener(onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageModified: (V2TimMessage message) {},onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageRevoked: (String messageid) {},onRecvNewMessage: (V2TimMessage message) {// カスタムメッセージを使用しますif(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM){String data = message.customElem.data;String desc = message.customElem.desc;String ext = message.customElem.extension;}},onSendMessageProgress: (V2TimMessage message, int progress) {},);TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
addAdvancedMsgListenerインターフェースを呼び出して、高度なメッセージリスナーを設定します。onRecvNewMessage (クリックして詳細を表示)をリッスンしてコールバックすることによって、V2TimMessageメッセージを取得します。removeAdvancedMsgListenerを呼び出して、リスナーを削除します。この手順は必須ではなく、お客様は業務のニーズに応じて呼び出すことができます。V2TimAdvancedMsgListener listener = V2TimAdvancedMsgListener(onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageModified: (V2TimMessage message) {},onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {},onRecvMessageRevoked: (String messageid) {},onRecvNewMessage: (V2TimMessage message) async {// 画像メッセージを使用しますif (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE) {String path = message.imageElem.path; // 画像がアップロードされたときのパスです。このフィールドはメッセージの送信者のみ持ちます。メッセージの送信者はこのフィールドを使用して画像を画面に事前表示し、画面表示の体験を最適化できます。for (var item in message.imageElem.imageList) { // 拡大図、オリジナル画像、サムネイルのトラバーサル// 画像属性を解析しますint height = item.height;String localUrl = item.localUrl;int size = item.size;int type = item.type; // 拡大図、オリジナル画像、サムネイルString url = item.url;String uuid = item.uuid;int width = item.width;}}// マルチメディアメッセージURLを取得しますV2TimValueCallback<V2TimMessageOnlineUrl> getMessageOnlineUrlRes =await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: '', // メッセージid);if (getMessageOnlineUrlRes.code == 0) {// 取得に成功しました}// マルチメディアメッセージをダウンロードしますV2TimCallback downloadMessageRes = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMessage(msgID: '', // メッセージidmessageType: 3, // メッセージタイプimageType: 0, // 画像タイプです。messageTypeが画像メッセージの場合のみ、有効ですisSnapshot: false // ビデオカバーであるかどうか。messageTypeがビデオカバーメッセージの場合のみ、有効です);if (downloadMessageRes.code == 0) {// ダウンロードに成功しました}},onSendMessageProgress: (V2TimMessage message, int progress) {},);TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
if(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_VIDEO){// カバー、再生アドレス、幅と高さ、およびサイズなどのビデオメッセージの属性を解析します。message.videoElem.UUID;message.videoElem.duration;message.videoElem.localSnapshotUrl;message.videoElem.localVideoUrl;message.videoElem.snapshotHeight;message.videoElem.snapshotPath;// ...}// マルチメディアメッセージURLを取得しますV2TimValueCallback<V2TimMessageOnlineUrl> getMessageOnlineUrlRes =await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: '', // メッセージid);if (getMessageOnlineUrlRes.code == 0) {// 取得に成功しました}// マルチメディアメッセージをダウンロードしますV2TimCallback downloadMessageRes = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMessage(msgID: '', // メッセージidmessageType: 5, // メッセージタイプimageType: 0, // 画像タイプです。messageTypeが画像メッセージの場合のみ有効ですisSnapshot: false // ビデオカバーであるかどうか。messageTypeがビデオカバーメッセージの場合のみ有効です);if (downloadMessageRes.code == 0) {// ダウンロードに成功しました}
if(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND){// 再生アドレス、サイズ、時間などの音声メッセージを解析します。message.soundElem.UUID;message.soundElem.dataSize;message.soundElem.duration;message.soundElem.localUrl;message.soundElem.url;// ...// マルチメディアメッセージURLを取得しますV2TimValueCallback<V2TimMessageOnlineUrl> getMessageOnlineUrlRes =await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: '', // メッセージid);if (getMessageOnlineUrlRes.code == 0) {// 取得に成功しました}// マルチメディアメッセージをダウンロードしますV2TimCallback downloadMessageRes = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMessage(msgID: '', // メッセージidmessageType: 4, // メッセージタイプimageType: 0, // 画像タイプです。messageTypeが画像メッセージの場合のみ有効ですisSnapshot: false // ビデオカバーであるかどうか。messageTypeがビデオカバーメッセージの場合のみ有効です);if (downloadMessageRes.code == 0) {// ダウンロードに成功しました}}
if(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_FILE){// ファイル名、ファイルサイズ、urlなどのファイルメッセージを解析しますmessage.fileElem.UUID;message.fileElem.fileName;message.fileElem.fileSize;message.fileElem.localUrl;message.fileElem.path;message.fileElem.url;// マルチメディアメッセージURLを取得しますV2TimValueCallback<V2TimMessageOnlineUrl> getMessageOnlineUrlRes =await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: '', // メッセージid);if (getMessageOnlineUrlRes.code == 0) {// 取得に成功しました}// マルチメディアメッセージをダウンロードしますV2TimCallback downloadMessageRes = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMessage(msgID: '', // メッセージidmessageType: 6, // メッセージタイプimageType: 0, // 画像タイプです。messageTypeが画像メッセージの場合のみ有効ですisSnapshot: false // ビデオカバーであるかどうか。messageTypeがビデオカバーメッセージの場合のみ有効です);if (downloadMessageRes.code == 0) {// ダウンロードに成功しました}}
locationElemから緯度と経度メッセージを直接解析できます。
サンプルコードは、V2TimMessageから地理位置メッセージの内容を解析する方法を示します。if(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_LOCATION){// 緯度と経度、説明などの地理位置メッセージを解析しますmessage.locationElem.desc;message.locationElem.latitude;message.locationElem.longitude;}
faceElem (クリックして詳細を表示)をご参照ください。その中で、indexおよびdataの内容は、お客様にカスタマイズされます。if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_FACE) {message.faceElem.data;message.faceElem.index;}
V2TIMGroupTipsElemの各フィールドを解析しますV2TIM_GROUP_TIPS_TYPE_GROUP_INFO_CHANGEを解析した場合は、これがグループデータの変更通知であることを示します。
受信側は、opMemberからオペレーター情報を取得し、さらにgroupChangeInfoListから変更されたグループ名を取得できます。
このとき、受信側は、「オペレーター」および「変更されたグループ名」を組み合わせて、グループプロンプトを作成できます。たとえば、「aliceは、グループ名をgroup123に変更した」。if(message.elemType == MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS){message.groupTipsElem.groupID; // 属するグループmessage.groupTipsElem.type; // グループTipsタイプmessage.groupTipsElem.opMember; // オペレーターデータmessage.groupTipsElem.memberList; // オペレーション対象のデータmessage.groupTipsElem.groupChangeInfoList; // グループメッセージ変更の詳細message.groupTipsElem.memberChangeInfoList; // グループメンバーの変更情報message.groupTipsElem.memberCount; // グループの現在オンライン人数}
Messageオブジェクトによって、最初のElemオブジェクトを正常に解析します。if(message.textElem.nextElem!=null){// 次のメッセージが存在します}
フィードバック